10、Oracle三种监听方式
客户端对监听的三种连接方式
1、专用服务器模式
专用服务器模式默认是启用的
专用服务器模式特点:
1、一个连接对应一个server process
好处:这个连接发送的SQL会被马上处理
坏处:即使这个连接空闲,这个server process还是存在,也需要占用资源,至少是内存资源
2、这种连接方式适合:连接数不多,但是每个连接相对繁忙的情况
3、一般数据库的连接数不超过1000,所以这种连接方式不适合大量的连接请求,连接数 <= 1000
2、共享服务器模式
图解:
例如:
启动4个进程(调度进程(dispatcher)或者代理进程),然后启动10个共享服务器进程(shared server process)来干活,现在有1000个连接,这1000个连接都分布到4个调度进程上,也就是每个调度进程要处理250个连接;
一个用户连接到其中一个调度进程上,发送出一条SQL,然后这个调度进程就把这条SQL放到一个队列里面去;
然后呢,同样有1000个连接,连接到这4个调度进程上,这时候,只需要启动4个调度进程就可以处理这1000个连接,所以可以启动少量的dispatcher,处理大量的连接,然后,dispatcher把这1000个连接放到队列里面去,这时候,10个共享服务器进程会轮询队列,比如共享服务器进程1轮询到一条SQL,它就执行这一条SQL,如果这条SQL是dispatcher1发出来的,它就把这个执行结果发送给dispatcher1
共享服务器模式只要设置了dispatcher和shared_services,共享服务器模式就启用了
共享服务器模式的特点:
1、处理连接数量很大
2、每一个连接相对轻松的情况,这种情况需要配置:dispatcher和共享服务器进程
配置dispatcher调度进程
查看dispatcher:
SQL> show parameter dispatcher
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=cisXDB)
max_dispatchers integer
配置dispatcher:
SQL> alter system set DISPATCHERS = '(PROTOCOL=TCP)(DISPATCHERS=3)' -- 设置dispatcher为3个
SQL> alter system set max_dispatchers = 10; -- 设置dispatcher最大10个(最大不超过10个)
查看dispatcher进程:
[oracle@db11g ~]$ ps -ef | grep ora
root 1409 1390 0 08:44 pts/0 00:00:00 su - oracle
oracle 1410 1409 0 08:44 pts/0 00:00:00 -bash
oracle 1436 1 0 08:44 ? 00:00:00 /u01/app/oracle/product/11.2.0/db_1/bin/tnslsnr LISTENER -inherit
oracle 1446 1 0 08:45 ? 00:00:01 ora_pmon_orcl
oracle 1448 1 0 08:45 ? 00:00:07 ora_psp0_orcl
oracle 1450 1 8 08:45 ? 00:09:09 ora_vktm_orcl
oracle 1454 1 0 08:45 ? 00:00:00 ora_gen0_orcl
oracle 1456 1 0 08:45 ? 00:00:01 ora_diag_orcl
oracle 1458 1 0 08:45 ? 00:00:01 ora_dbrm_orcl
oracle 1460 1 0 08:45 ? 00:00:19 ora_dia0_orcl
oracle 1462 1 0 08:45 ? 00:00:01 ora_mman_orcl
oracle 1464 1 0 08:45 ? 00:00:01 ora_dbw0_orcl
oracle 1466 1 0 08:45 ? 00:00:01 ora_lgwr_orcl
oracle 1468 1 0 08:45 ? 00:00:04 ora_ckpt_orcl
oracle 1470 1 0 08:45 ? 00:00:00 ora_smon_orcl
oracle 1472 1 0 08:45 ? 00:00:00 ora_reco_orcl
oracle 1474 1 0 08:45 ? 00:00:04 ora_mmon_orcl
oracle 1476 1 0 08:45 ? 00:00:09 ora_mmnl_orcl
oracle 1478 1 0 08:45 ? 00:00:00 ora_d000_orcl -- dispatcher进程
oracle 1480 1 0 08:45 ? 00:00:00 ora_s000_orcl
oracle 1492 1 0 08:45 ? 00:00:00 ora_qmnc_orcl
oracle 1504 1 0 08:45 ? 00:00:01 ora_cjq0_orcl
oracle 1517 1 0 08:45 ? 00:00:00 ora_q000_orcl
oracle 1519 1 0 08:45 ? 00:00:00 ora_q001_orcl
oracle 1537 1 0 08:50 ? 00:00:00 ora_smco_orcl
oracle 1572 1 0 09:00 ? 00:00:00 ora_w001_orcl
oracle 2117 1410 0 10:29 pts/0 00:00:00 ps -ef
oracle 2118 1410 0 10:29 pts/0 00:00:00 grep ora
配置共享服务器进程
查看共享服务器进程:
SQL> show parameter shared
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address integer 0
max_shared_servers integer
shared_memory_address integer 0
shared_pool_reserved_size big integer 6710886
shared_pool_size big integer 0
shared_server_sessions integer
shared_servers integer 1
配置共享服务器:
SQL> alter system set shared_servers = 10; -- 设置shared_servers为10个
System altered.
查看共享服务器进程:
[oracle@db11g ~]$ ps -ef | grep ora
root 1409 1390 0 08:44 pts/0 00:00:00 su - oracle
oracle 1410 1409 0 08:44 pts/0 00:00:00 -bash
oracle 1436 1 0 08:44 ? 00:00:00 /u01/app/oracle/product/11.2.0/db_1/bin/tnslsnr LISTENER -inherit
oracle 1446 1 0 08:45 ? 00:00:01 ora_pmon_orcl
oracle 1448 1 0 08:45 ? 00:00:07 ora_psp0_orcl
oracle 1450 1 8 08:45 ? 00:09:49 ora_vktm_orcl
oracle 1454 1 0 08:45 ? 00:00:00 ora_gen0_orcl
oracle 1456 1 0 08:45 ? 00:00:01 ora_diag_orcl
oracle 1458 1 0 08:45 ? 00:00:01 ora_dbrm_orcl
oracle 1460 1 0 08:45 ? 00:00:21 ora_dia0_orcl
oracle 1462 1 0 08:45 ? 00:00:01 ora_mman_orcl
oracle 1464 1 0 08:45 ? 00:00:01 ora_dbw0_orcl
oracle 1466 1 0 08:45 ? 00:00:01 ora_lgwr_orcl
oracle 1468 1 0 08:45 ? 00:00:05 ora_ckpt_orcl
oracle 1470 1 0 08:45 ? 00:00:00 ora_smon_orcl
oracle 1472 1 0 08:45 ? 00:00:00 ora_reco_orcl
oracle 1474 1 0 08:45 ? 00:00:04 ora_mmon_orcl
oracle 1476 1 0 08:45 ? 00:00:09 ora_mmnl_orcl
oracle 1478 1 0 08:45 ? 00:00:00 ora_d000_orcl
oracle 1480 1 0 08:45 ? 00:00:00 ora_s000_orcl
oracle 1492 1 0 08:45 ? 00:00:00 ora_qmnc_orcl
oracle 1504 1 0 08:45 ? 00:00:01 ora_cjq0_orcl
oracle 1517 1 0 08:45 ? 00:00:00 ora_q000_orcl
oracle 1519 1 0 08:45 ? 00:00:00 ora_q001_orcl
oracle 1537 1 0 08:50 ? 00:00:00 ora_smco_orcl
oracle 1572 1 0 09:00 ? 00:00:00 ora_w001_orcl
oracle 2134 1 0 10:34 ? 00:00:00 ora_s001_orcl
oracle 2136 1 0 10:34 ? 00:00:00 ora_s002_orcl
oracle 2138 1 0 10:34 ? 00:00:00 ora_s003_orcl
oracle 2140 1 0 10:34 ? 00:00:00 ora_s004_orcl
oracle 2142 1 0 10:34 ? 00:00:00 ora_s005_orcl -- 共享服务器进程
oracle 2144 1 0 10:34 ? 00:00:00 ora_s006_orcl
oracle 2146 1 0 10:34 ? 00:00:00 ora_s007_orcl
oracle 2148 1 0 10:34 ? 00:00:00 ora_s008_orcl
oracle 2150 1 0 10:34 ? 00:00:00 ora_s009_orcl
oracle 2160 1410 0 10:37 pts/0 00:00:00 ps -ef
oracle 2161 1410 0 10:37 pts/0 00:00:00 grep ora
专用服务器模式和共享服务器模式都启动时
当专用服务器模式和共享服务器模式都启动的时候:客户端都可以连接这两种模式,但是连接哪种模式是由客户端来决定的
客户端怎么控制连接专用服务器模式还是共享服务器模式?
修改tnsname.ora文件
[oracle@db11g admin]$ vi tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
CISTEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.70)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = cis)
(SERVICE = dedicated) -- 加上这一行,dedicated:表示使用专用服务器模式连接
) -- 如果添加:(SERVICE = shared):表示使用共享服务器模式连接
)
3、连接池
图解:
客户端连接应用服务器,应用服务器主动地模拟客户端,向数据库发起了N条连接(N个连接都是专用服务器连接),就是应用服务器向数据库建立了N条连接;然后,一个客户端连接到应用服务器上,客户端打开某一个应用,要搜索某个东西,
这时候,这个东西在数据库里面,应用服务器就要从数据库里取数据,应用服务器这时候就从连接池里面占用一个连接,
从连接池里面找一个空闲的连接占用这个连接,然后数据库给应用服务器一个响应,把数据给应用服务器,应用服务器再把数据返回给客户端
连接池是在服务器端建立的
连接池:
1、应用服务器模拟客户端向数据库建立了一个连接池(n个专用服务器连接)
2、客户端要从数据库取数据,应用服务器占用一个连接,发送SQL
3、连接对应的server process处理SQL
4、SQL结果返回,结果返回给用户
5、释放连接对应的server process
连接池特点
1、可以处理大量的客户端连接
2、数据库的连接池数量不是很大
3、不需要频繁的建立和断开对数据库的连接
连接池需要应用的支持
连接池只是被占用和释放,连接池一直存在
如果应用不支持怎么办?
就会出现大量的连接建立、断开
配置连接池
服务器端配置
SQL> exec dbms_connection_pool.configure_pool(minsize => 5,maxsize => 10,incrsize => 1,inactivity_timeout => 60);
-- 连接池的最小连接数为5个,最大10个,随着连接的增加,每次增加一个;如果不用的时候,比如现在有10个,慢慢的其中五个会断开,回到5个连接
SQL> exec dbms_connection_pool.start_pool; -- 启动连接池
查看连接池:
[oracle@db11g admin]$ ps -ef | grep ora
root 1409 1390 0 08:44 pts/0 00:00:00 su - oracle
oracle 1410 1409 0 08:44 pts/0 00:00:00 -bash
oracle 1436 1 0 08:44 ? 00:00:00 /u01/app/oracle/product/11.2.0/db_1/bin/tnslsnr LISTENER -inherit
oracle 1446 1 0 08:45 ? 00:00:02 ora_pmon_orcl
oracle 1448 1 0 08:45 ? 00:00:12 ora_psp0_orcl
oracle 1450 1 8 08:45 ? 00:16:09 ora_vktm_orcl
oracle 1454 1 0 08:45 ? 00:00:01 ora_gen0_orcl
oracle 1456 1 0 08:45 ? 00:00:01 ora_diag_orcl
oracle 1458 1 0 08:45 ? 00:00:01 ora_dbrm_orcl
oracle 1460 1 0 08:45 ? 00:00:33 ora_dia0_orcl
oracle 1462 1 0 08:45 ? 00:00:01 ora_mman_orcl
oracle 1464 1 0 08:45 ? 00:00:01 ora_dbw0_orcl
oracle 1466 1 0 08:45 ? 00:00:01 ora_lgwr_orcl
oracle 1468 1 0 08:45 ? 00:00:08 ora_ckpt_orcl
oracle 1470 1 0 08:45 ? 00:00:01 ora_smon_orcl
oracle 1472 1 0 08:45 ? 00:00:00 ora_reco_orcl
oracle 1474 1 0 08:45 ? 00:00:06 ora_mmon_orcl
oracle 1476 1 0 08:45 ? 00:00:15 ora_mmnl_orcl
oracle 1478 1 0 08:45 ? 00:00:00 ora_d000_orcl
oracle 1480 1 0 08:45 ? 00:00:00 ora_s000_orcl
oracle 1492 1 0 08:45 ? 00:00:00 ora_qmnc_orcl
oracle 1504 1 0 08:45 ? 00:00:02 ora_cjq0_orcl
oracle 1517 1 0 08:45 ? 00:00:00 ora_q000_orcl
oracle 1519 1 0 08:45 ? 00:00:00 ora_q001_orcl
oracle 1537 1 0 08:50 ? 00:00:01 ora_smco_orcl
oracle 2134 1 0 10:34 ? 00:00:00 ora_s001_orcl
oracle 2136 1 0 10:34 ? 00:00:00 ora_s002_orcl
oracle 2138 1 0 10:34 ? 00:00:00 ora_s003_orcl
oracle 2140 1 0 10:34 ? 00:00:00 ora_s004_orcl
oracle 2142 1 0 10:34 ? 00:00:00 ora_s005_orcl
oracle 2144 1 0 10:34 ? 00:00:00 ora_s006_orcl
oracle 2146 1 0 10:34 ? 00:00:00 ora_s007_orcl
oracle 2148 1 0 10:34 ? 00:00:00 ora_s008_orcl
oracle 2150 1 0 10:34 ? 00:00:00 ora_s009_orcl
oracle 2374 1 0 11:40 ? 00:00:00 ora_w000_orcl
oracle 2402 1 0 11:49 ? 00:00:00 ora_n000_orcl -- 连接池的代理
oracle 2404 1 0 11:49 ? 00:00:00 ora_l000_orcl
oracle 2406 1 0 11:49 ? 00:00:00 ora_l001_orcl
oracle 2408 1 0 11:49 ? 00:00:00 ora_l002_orcl -- 5个连接的连接池
oracle 2410 1 0 11:49 ? 00:00:00 ora_l003_orcl
oracle 2412 1 0 11:49 ? 00:00:00 ora_l004_orcl
oracle 2413 1410 1 11:49 pts/0 00:00:00 ps -ef
oracle 2414 1410 0 11:49 pts/0 00:00:00 grep ora
select connection_pool, status, minsize, maxsize, INACTIVITY_TIMEOUT from dba_cpool_info;
关闭连接池:
SQL> exec dbms_connection_pool.stop_pool; -- 关闭连接池
客户端配置
修改tnsname.ora文件
[oracle@db11g admin]$ vi tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
CISTEST =
(DESCRIPTION =
(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.70)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = cis)
(SERVICE = pooled)
)
)
添加内容:
(SERVER = pooled)