大部分情况下,我们使用专用连接方式。对专用连接来说,用户在客户端启动了一个应用程序,比如SQL*Plus,于是就在客户端本地启动了一个用户进程。与Oracle服务器成功建立连接以后,就会在数据库服务器端生成一个对应的服务器进程,该服务器进程作为用户进程的代理进程,也叫影子进程,从而代替客户端去执行各种命令并将结果返回。也就是说,用户在客户端输入的各种命令,都是通过位于客户端的用户进程发送到服务器端对应的服务器进程,并由服务器进程代替用户进程去执行具体的命令及返回结果。用户进程是不能直接访问数据库的。在专用连接模式下,用户进程与服务器进程一一对应,用户进程一旦终止,服务器进程也随之终止。
另外,我们还有一种连接方式,叫共享连接。在共享连接情况下,DBA可以定义服务器进程的个数。在启动数据库时,Oracle会预先在实例中建立指定个数的服务器进程。这时,用户进程不再与服务器进程产生一对一的关系,而是一对多的关系。也就是一个用户进程可以对应多个服务器进程,多个服务器进程都可以处理同一个用户发出的不同命令。共享连接比较少见,因此我们不多讨论。以下只要没有特殊说明,都是指专用连接。
当用户成功的建立连接以后,会在服务器端生成对应的服务器进程,同时创建一个会话(session)。所谓session就是一段内存空间,该空间里记录了用户采用了什么应用程序连接到数据库、客户端机器的名称、以哪个用户名登录等信息。这里需要解释Oracle中的两个容易混淆的概念:连接(connection)和会话(session)。
所谓连接,指的是物理概念。也就是从客户端到服务器端的通信通道。
有以下三种连接类型。
1、本机登录:直接从数据库所在的服务器上登录到数据库。这时采用内部通信机制进行连接。
2、C/S模式:客户机和服务器都在同一个局域网内,而终端用户从客户端登录数据库,并借助Oracle的网络组件,通过网络设备与数据库服务器建立连接。例如在客户端使用oracle的emterprise console连接到服务器。
3、B/S模式:也叫三层模式。客户端不具有Oracle网络组件,通过浏览器与应用服务器建立连接,然后在应用服务器上预先建立的连接池中挑选连接通道。
我们以本机登录为例,来看一下用户进程与服务器进程的概念。我们启动SQL*Plus,并登录到数据库实例。
$ ps -ef|grep sqlplus
oracle 2651 2650 0 01:01 pts/2 00:00:00 sqlplus as sysdba
oracle 2783 2758 0 01:16 pts/3 00:00:00 grep sqlplus
可以看到2651即为我们启动的用户进程。继续如下查询
$ ps -ef|grep 2651
oracle 2651 2650 0 01:01 pts/2 00:00:00 sqlplus as sysdba
oracle 2757 2651 0 01:16 ? 00:00:00 oracleczmmiao (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
可以看到2651号进程衍生出了一个进程,也就是2757号进程,这个进程就是Oracle为用户进程(进程号为2757)创建的服务器进程。从该服务器进程的描述信息中可以看到, LOCAL=YES表明该进程由于与数据库本身在同一个服务器上运行的另一个进程而启动,也就是本机登录。PROTOCOL=beq说明采用的是bequeath协议登录,而不是采用tcp协议。一旦用户与数据库服务器建立连接,就可以发出各种命令,开始使用Oracle数据库了。
参考至:《教你如何成为10g OCP》韩思捷著
如有错误,欢迎指正