连接并不是会话的同义词,发现这一点时很多人都很诧异。在大多数人眼里,它们都是一样的,但事实上并不一定如此。在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,一条连接上的各个会话可以使用不同的用户身份!
在Oracle中,连接只是客户进程和数据库实例之间的一条特殊线路,最常见的就是网络连接。这条连接可能连接到一个专用服务器进程,也可能连接到调度器。如前所述,连接上可以有0个或多个会话,这说明可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。下面更详细地定义这些术语:
? 连接(connection):连接是从客户到Oracle实例的一条物理路径。连接可以在网络上建立,或者通过IPC机制建立。通常会在客户进程与一个专用服务器或一个调度器之间建立连接。不过,如果使用Oracle的连接管理器(Connection Manager ,CMAN),还可以在客户和CMAN之间以及CMAN和数据库之间建立连接。CMAN的介绍超出了本书的范围,不过Oracle Net Services Administrator’s Guide(可以从http://otn.oracle.com免费得到)对CMAN有详细的说明。
? 会话(session):会话是实例中存在的一个逻辑实体。这就是你的会话状态(session state),
也就是表示特定会话的一组内存中的数据结构。提到“数据库连接”时,大多数人首先想到的就是“会话”。你要在服务器中的会话上执行SQL、提交事务和运行存储过程。
简单地说,连接和会话之间有一种多对多的关系。不过,最常见的是专用服务器与单一会话之间的一对一关系,这也是大多数人每天所看到的情况。
A process is a physical process or thread.
On unix, you can see a process with "ps" for example. It is there.
There are many types of processes in Oracle -- background processes like SMON, PMON,
RECO, ARCH, CKPT, EMNn, DBWR, etc..... And user processes like dedicated servers or
shared server (multi-threaded server -- aka MTS -- configuration)
每个sql login称为一个连接(connection),而每个连接,可以产生一个或多个会话,如果数据库运行在专用服务器方式,一个会话对应一个服务器进程(process),
如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。
在dedicated server机器上的测试如下:
数据库的session和操作系统process是对应的。
这表示一个session对应一个process,但是一个process未必对应一个session。
大家可以通过SELECT spid
FROM v$process
WHERE NOT EXISTS ( SELECT 1
FROM v$session
WHERE paddr = addr); 查看
或
SQL> select count(*) from v$process;
COUNT(*)
----------
53
SQL> select count(*) from v$session;
COUNT(*)
----------
50
session 相关的初始化参数:
process:oracle的连接数(sessions)与其参数文件中的进程数(process)相关,它们的关系如下:sessions=(1.1*process+5),我们可以通过修改inia.ora的这个process参数在更改可连接的最大session数。
workarea_size_policy:PGA用手动管理还是自动管, 在AUTO的时候每个session最多能用到5%或100M.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8797129/viewspace-693071/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8797129/viewspace-693071/