【正确答案】在连接到Oracle数据库的时候,可以有两种连接模式,一种称为专用服务器连接(Dedicated Server),另外一种称为共享服务器连接(Shared Server)。下面将分别讲解这两种连接方式的不同点。
专用服务器:每次在对Oracle进行访问的时候,Oracle服务器的Listener会得到这个访问请求,然后会为这个访问创建一个新的进程来进行服务。所以说,对于每一个客户端的访问,都会生成一个新的进程进行服务,是一种类似一对一的映射关系。这种连接模式的一个很重要的特点就是UGA(User Global Area,用户全局区)是存储在PGA(Program Global Area,程序全局区)中的,这个特性也很好说明了当前用户的内存空间是按照进程来进行分配的。专用服务器连接模式是Oracle默认的连接模式。
共享服务器:也称为多线程服务器(Multi-Threaded Server,MTS)。若采用共享服务器模式的话,则在数据库初始化的时候就会创建一批服务器连接的进程,然后把这些连接进程放入一个连接池来进行管理。初始化的池中的进程数量在数据库初始化建立的时候是可以手动设置的。在连接建立的时候,Listener首先接收到客户端的建立连接的请求,然后Listener去生成一个称为调度器(Dipatcher)的进程与客户端进行连接。调度器把客户端的请求放在SGA(System Global Area,系统全局区)的一个请求队列中,然后在共享服务器连接池中查找有无空闲的连接,然后让这个空闲的服务器进行处理。处理完毕以后再把处理结果放在SGA的相应队列中。调度器通过查询相应队列,得到返回结果,再返回给客户端。这种连接模式的优点在于服务器进程的数量可以得到控制,不大可能出现因为连接数过多而造成服务器内存崩溃。但是由于增加了复杂度以及请求相应队列,可能在性能上有所下降。
如果在前端使用了Weblogic的连接池,那么在数据库级别就没有必要再使用共享服务器了,因为这时的用户连接已经在Weblogic层面上得到了控制。其实专用服务器和共享服务器是可以并存的,即使使用了共享服务器,某些管理操作也是必须在专用服务器模式下来做的,比如STARTUP或SHUTDOWN。
(1)启用共享服务器 要切换到共享模式,可以使用以下步骤:
1)设置初始化参数SHARED SERVERS大于0,然后重启数据库即可启动共享模式,SQL如下:

其中,SHARED_SERVERS指定了当实例启动的时候共享服务器进程启动的数量。如果这个参数的值为0,那么表示数据库没有启动共享服务模式。这个参数是配置共享服务器必需的,而且只有这个参数是必需的。MAX_SHARED_SERVERS是Oracle在同一个时刻最大能够使用的共享服务器进程数量。如果SHARED_SERVERS大于MAX_SHARED_SERVERS,那么Oracle会以SHARED_SERVERS参数的值覆盖MAX_SHARED_SERVERS。
2)设置DISPATCHERS参数,可以采用下面的方法设置:

其中,“PROTOCOL=TCP”表示的是协议,“SERVICE=lhrdbXDB”指定要采用共享服务器模式的服务名称。使用上面的模式指定只启动某个服务的共享模式,如果要设置所有服务都使用共享模式,则设置为:

3)客户端的tnsnames.ora的文件中,在CONNECT_DATA设置一项中增加“(server=shared)”一项,即可使用共享服务器连接,如下:

其中,SERVICE_NAME的值可以通过命令“lsnrctl services<listener name>”来查看,如下:

如果服务器端没有启动共享服务器模式,而客户端使用shared方式连接的话,那么会出现错误提示:“ORA-12520:TNS:监听程序无法找到需要的服务器类型的可用句柄”。
如果同时把SHARED_SERVERS和MAX_SHARED_SERVERS都设置成0,那么共享服务器将关闭。
(2)判断会话的连接模式 可以从V$SESSION视图的SERVER列里查看:
