在论坛上遇见过很多人问起如何判断oracle是共享模式还是专用模式.以前自己也对这个问题迷茫过.google下发现不少好东西.特做个笔记便于理解和记忆.
专用服务器:一个客户端连接对应一个服务器进程
共享服务器:多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理。
Oracle缺省用的是专用服务器模式,Oracle可以同时支持共享服务器和专用服务器模式,可以指定一个会话使用专用服务器,另一个会话使用共享服务器。
共享服务器具有以下一些缺点:
1)共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。
2)存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。
3)存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。
4)共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,并且SQL_TRACE没有意义(因为是共享而不是当前会话的)。
MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,但它却使用SGA的Large_Pool来分配UGA,拆东墙补西墙,所减少的内存是很少的。
如果用户会话的连接和断开很频繁,数据库进程的创建和删除的开销会非常大,这种情况最好采用共享服务器模式(否则,应该使用连接池技术)。
如果客户端一次连接终身使用(会话生命周期内),使用共享服务器模式的意义不大。因为大部分时间,一个会话就连接到一个服务器进程,无法共享服务器进程。
判断oracle是共享模式还是专用模式有以下方法:
1) show parameter shared_server; (注:8i应为:show parameter mts_servers;)
如果数值> 0 ,就是enable了共享服务器.
2).在配置为共享服务器的情况,Client可以用共享服务器或者专用服务器来联接数据库,这个参数的控制是在tnsnames.ora里设定的。如:
aaaa=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = aaaa)(PORT = 1521))
)
(CONNECT_DATA =
(SID = aa)
(SERVER =DEDICATED)
)
)
用DEDICATED方式连接DB.
另外,Background process ,以及通过本地连接进来的,只能是DEDICATED .比如说sqlplus user/pass形式
如果DB没有配置共享服务器,那么Client只能以DEDICATED方式连接DB.
3)判断一个已经连接的session的连接方式
a)select server from v$session where ...
如果server = 'DEDICATED'则是DEDICATED方式
server='SHARED'则是shared方式,并且正有shared_server_process为其服务
server='NONE'的话,则是shared方式,并且当前没有shared_server_process为其服务
b)仅用于Unix底下,似乎windown不行
连接v$session, v$process看process中的program
select p.program,s.server from v$session s , v$process p where s.paddr = p.addr
如果program为...(S0NN)的,则是shared方式,并且正有shared_server_process为其服务
如果program为...(D0NN)的,则是shared方式,并且当前没有shared_server_process为其服务
如果program为其它的,则是'DEDICATED'方式