4.5.2 共享数据库连接模式

专用数据库连接模式在处理大批量用户连接时效率并不高,因为需要为每个用户进程启动一个服务器进程,这样会消耗大量的系统资源。如果用户进程的大部分连接时间都处于空闲状态,服务器的资源就会被白白浪费。比如在银行储蓄系统中,计算机处理一次存取款的时间为几毫秒,而工作人员输入相关信息却需要几分钟的时间。

Oracle提供了一种共享数据库连接模式,这种模式允许一个服务器进程同时为多个用户进程服务,多个用户进程共享一个服务器进程。当一个用户进程处于空闲状态时,比如正在等待用户输入数据,服务器进程就可以处理其他用户进程的请求。在这种情况下,服务器进程的工作效率得到了很大的提高。

在数据库服务器中可以启动多个共享服务器进程,每个服务器进程都可以处理多个用户请求,在数据库服务器中只需要少量的服务器进程就可以处理大量的用户请求。

Oracle推荐在以下情况采用共享数据库连接模式:

·在联机事务处理(OLTP)环境中访问数据库。可能有大量用户进程需要连接到数据库服务器,这种模式可以使用户进程有效地使用系统资源。

·计算机的内存有限。与专用服务器相比,当用户进程数量增加时,共享服务器的数量并不需要增加,或者增加很少,这就减少了对内存的要求。

·如果需要使用Oracle Net的特性,如连接共享、连接集中和负载均衡。共享数据库连接模式的工作原理如图4.6所示。

figure_0177_0038

图 4.6 共享数据库连接模式

在图4.6中,调度器、共享服务器进程、请求队列和响应队列共同完成共享数据库连接模式的功能。其中请求队列和响应队列是SGA的一部分,为了更清楚地表示这几部分之间的关系,在图4.6中我们将这两个队列从SGA中分离出来。

调度器负责接收用户的请求,并将用户请求传递给适当的共享服务器进程。在一个数据库服务器中可以启动多个调度器,而且至少要为Oracle支持的每一种网络协议启动一个调度器(如TCP/IP、IPX/SPX、命名管道等)。可以通过初始化参数DISPATCHERS和MAX_DISPATCHERS来指定调度器的数目。其中参数DISPATCHERS指定为某类网络协议启动的调度器,而MAX_DISPATCHERS用来设置数据库服务器中可以启动的最大调度器的数目。例如:


DISPATCHERS=(PROTOCOL=TCP)(DISPATCHERS=3)

MAX_DISPATCHERS=20


上面的两个参数规定为TCP/IP协议启动3个调度器,而总的调度器数目为20。

当用户进程向数据库服务器发出请求时,监听器在指定的端口监听用户的请求,并将请求传递给一个负载较轻的调度器,调度器将这个请求以及自己的ID一起放到请求队列中。

共享服务器进程从请求队列中取出一个请求,并对其中的SQL命令进行解析和执行,然后将执行的结果放到响应队列中。解析和执行的过程与专用服务器相同。

在一个数据库服务器中可以启动多个共享服务器进程,这些进程可以处理任何一个用户进程发出的请求,而不是处理一个确定的请求。共享服务器进程的数目由初始化参数SHARED_SERVERS和MAX_SHARED_SERVERS指定,其中参数SHARED_SERVERS指定在初始情况下需要启动的共享服务器进程数目,而参数MAX_SHARED_SERVERS指定了允许启动的最大共享服务器进程数目。当用户请求较多时,数据库服务器将启动更多的共享服务器进程,而当用户请求较少时,服务器将关闭不必要的共享服务器进程,但在任一时刻,共享服务器进程的数目将保持在两个参数SHARED_SERVERS和MAX_SHARED_SERVERS的值之间。

调度器除了负责将用户进程的请求传递给共享服务器进程外,还负责将共享服务器进程处理的结果返回给用户进程。调度器周期性地检查响应队列,如果发现与自己ID一致的处理结果,调度器将取出这个结果,并将它返回给用户进程。这个处理结果就是在此之前,由该调度器传递给共享服务器进程的某个用户请求的处理结果,调度器根据其中的ID判断它是否属于自己。

需要注意的是,在共享数据库连接模式下也可以启动专用服务器进程。有些用户请求是不适合以共享数据库连接模式处理的。例如,当用户以DBA身份登录数据库服务器时,用户进程无法与调度器通信。当数据库服务器监听到这样的用户请求时,它将为用户进程启动一个专用服务器进程,以处理该用户的所有操作。