Oracle 专用模式(DEDICATED) 和 共享模式(SHARE)
一、专用服务器(DEDICATED):
一个客户端连接对应一个服务器进程,专用服务器体系:每个客户进程与专用服务器进程连接。服务器进程没被任何另外的客户共享。
专用服务器体系结构不支持HTTP和IIOP客户,仅支持TTC客户。
一般我们以oracle默认的专用服务器方式就行了,没必要使用共享服务器模式。
1)、也叫做多线程服务器模式
多个用户进程使用同一个服务器进程。 多个客户端连接对应一个服务器进程,服务器端用一个进程调度器来管理。 1、它必须使用net services. 2、必须配置tnsnames.ora。
2)、适合场景
它适合用于高并发,事务量小的情况,如果这个时候采用了共享模式,可以大大减少由于高度并发对于ORACLE服务器的资源消耗。
共享服务器体系:客户进程最终与一个调度程序连接,PMON进程注册了调度程序的位置和负荷,
使监听器能够提交到负荷最小的调度程序。一个调度程序能并发地支持多重的客户连接。
1)共享服务器的代码路径比专用服务器长,所以它天生就比专用服务器慢。 2)存在人为死锁的可能,因为它是串行的,只要一个连接阻塞,则该服务器进程上的所有用户都被阻塞,并且极可能死锁。 3)存在独占事务的可能,因为如果一个会话的事务运行时间过长,它独占共享资源,其它用户只能等待,而专用服务器,每个客户端是一个会话。 4)共享服务器模式限制了某些数据库特性,例如:不能单独启动和关闭实例,不能进行介质恢复,不能使用Log Miner,
并且SQL_TRACE没有意义(因为是共享而不是当前会话的)。 MTS减少的内存实际上是专用服务器模式下每个用户连接到操作系统进程所需的内存,但它却使用SGA的Large_Pool来分配UGA,
拆东墙补西墙,所减少的内存是很少的。如果用户会话的连接和断开很频繁,数据库进程的创建和删除的开销会非常大,
这种情况最好采用共享服务器模式(否则,应该使用连接池技术)。如果客户端一次连接终身使用(会话生命周期内),使用共享服务器模式的意义不大。
因为大部分时间,一个会话就连接到一个服务器进程,无法共享服务器进程。
shared_servers :指定了当instance 启动的时候 shared server process 启动的数量,不要将这个参数设置得太大,否者启动数据库instance 的时候
就会花更多时间,Oracle启动过后会根据负载来动态调整shared_servers。如果为0,表示数据库没有启动共享服务模式。 这个参数是配置shared server 必须的,
而且只有这个参数是必须的。 修改参数:
//alter system set shared_servers=1; max_shared_servers:ORACLE在同一个时刻最大能够使用的 shared server process.不要将这个参数设置小于 shared_servers,
如果动态修改shared_servers大于max_shared_servers,ORACLE会覆盖max_shared_servers的值,此时你需要修改max_shared_servers.
同时也不能大于processes。这个参数是为了给占用很大资源操作而设的(批处理),为了预留一些process 给DBA任务(rman备份), shared_server_sesions: 指定了总共允许的的shared server session 的数量。如果设置了这个参数,那么就不要将这个值超过sessions,
如果没有设置这个值,那么只要还有空闲的session,就可以被使用。设置这个值是为专有连接预留 user sessions. dispatchers:配置 dispatcher process .如果不设置这个参数,只要设置了shared_servers ,oracle 也会自动设置一个基于tcp协议的dispatcher。
还需要查看操作系统支持一个dispatcher能处理多少个connections
将shared_servers参数置为0,那么所有以共享方式连接到数据库都不能成功,但是未释放的共享连接会继续 保持连接,直到断开。
如果将shared_servers 和max_shared_servers都设为0,那么共享连接将被终结。所有的共享方式连接都断开了的话,
就可以使用alter system set dispatcher=’’; 将dispatcher清除,防止下次启动数据库又打开了共享连接方式。
[oracle@shdb02 ~]$ lsnrctl service LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 10-MAR-2022 23:03:34 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521)) Services Summary... Service "+ASM" has 1 instance(s). Instance "+ASM2", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 state:ready LOCAL SERVER Service "fp" has 1 instance(s). Instance "fp2", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:1790 refused:0 state:ready LOCAL SERVER The command completed successfully
[oracle@shdb02 ~]$ locate tnsnames.ora /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
Oracle默认的Server Process是Dedicated,因此无需特殊配置
只要在Client的连接方式上声明Server为DEDICATED。比如Oracle Client的tnsname.ora文件声明如下
[oracle@shfpdb02 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
STANDBY1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.121.51.40)(PORT = 1521))
)
(CONNECT_DATA =
(SID = shfpdb1)
(SERVICE_NAME = standby)
)
)
htstandby1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.128.54.20)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED) //使用专用模式连接,改成共享模式这样改 (SERVER = shared),当然你还需要在控制台进行开启共享模式的一些配置和设置。
(SERVICE_NAME = htstandby1)
)
)
SHDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.129.50.45)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)//使用专用模式连接
(SERVICE_NAME = shdb)
)
)
Background process ,以及通过本地连接进来的,只能是DEDICATED (专用模式). 比如说sqlplus user/pass形式 如果数据库没有配置共享服务器,那么客户端只能以DEDICATED方式连接数据库. ORA-12545 连接因对象主机或对象不存在而失败. ORA-12545: Connect failed because target host or object does not exist
查询当前数据库使用什么模式的方法: select * from v$shared_servers 任何一个结果为空时 当前库使用的是专用服务器模式: select * from v$dispatchers 对应的参数为空 则为专用服务器模式: show parameter dispatchers 结果中server列的值为dedicated 则为专用服务器模式:select * from v$session 对应的监听下可见 DEDICATED 为专用服务器模式: lsnrctl services
select * from v$queue查看队列
select * from v$circuit
查看哪些进程在服务 select * from v#shared_server_monitor
具体看下查询当前数据库使用什么模式的方法
1)select * from v$shared_servers (8i之后)
SQL> show parameter shared_server; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ max_shared_servers integer shared_server_sessions integer shared_servers integer 1
2). 查看v$session 视图
SQL> Select username,server,program from v$session where username is not null;
USERNAME SERVER
------------------------------ ---------
PROGRAM
------------------------------------------------
SYS DEDICATED
oraagent.bin@shfpdb02 (TNS V1-V3)
SHFP DEDICATED
plsqldev.exe
SYS DEDICATED
sqlplus@shfpdb02 (TNS V1-V3)
USERNAME SERVER
------------------------------ ---------
PROGRAM
------------------------------------------------
SHFP DEDICATED
JDBC Thin Client
SHFP DEDICATED
JDBC Thin Client
SQL> select t.SID,t.USERNAME,t.SERVER from v$session t; SID USERNAME SERVER ---------- ------------------------------ --------- 77 DEDICATED 115 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 381 DEDICATED420 SYS DEDICATED 457 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 761 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 1141 DEDICATED SID USERNAME SERVER ---------- ------------------------------ --------- 1635 DEDICATED1825 SH DEDICATED 1863 SYS DEDICATED 2015 SH DEDICATED2129 SH DEDICATED 54 rows selected.