ORACLE会话连接进程三者总结
概念介绍 通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文(Context)。这个上下文是一段位于服务器端的内存:记录了本次连接的客户端机器、通过哪个应用程序、哪个用户登录等信息.
连接(Connection):连接是从客户端到ORACLE实例的一条物理路径。连接可以在网络上建立,或者在本机通过IPC机制建立。通常会在客户端进程与一个专用服务器或一个调度器之间建立连接。 会话(Session) 是和连接(Connection)是同时建立的,两者是对同一件事情不同层次的描述。简单讲,连接(Connection)是物理上的客户端同服务器的通信链路,会话(Session)是逻辑上的用户同服务器的通信交互。 ORACLE中一个用户登录ORACLE服务器的前提,就是该用户具有ORACLE的 “CREATE SESSION”权限。ORACE允许同一个用户在同一个客户机上建立多个同服务器的会话,每个SESSION都代表了用户与服务器的一个交互。就像你用IE浏览器打开博客园网站,然后你再打开一个IE窗口,又打开一个博客园网站。两个IE窗口就相当于两个SESSION, 而物理链路就相当于连接(Connection)。后台进程PMON会每隔一段时间,就会检测用户连接状况,如果连接已断开,PMON会清理现场,释放相关的资源。 在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的,即使它们共享同一条数据库物理连接也是如此。一个会话中的提交不会影响该连接上的任何其他会话。实际上,还可以有连接而无相应的会话。另外,一个会话可以有连接也可以没有连接。使用高级Oracle Net特性(如连接池)时,客户可以删除一条物理连接,而会话依然保留(但是会话会空闲)。客户在这个会话上执行某个操作时,它会重新建立物理连接。 在专用服务器中,一个会话对应一个服务器进程(Process),如果数据库运行在共享服务器方式,一个服务器进程可以为多个会话服务。 下面是一段关于连接(connection)、会话、进程的英文描述 A connection is a physical circuit between you and the database. A connection might be one of many types -- most popular begin DEDICATED server and SHARED server. Zero,one or more sessions may be established over a given connection to the database as show above with sqlplus. A process will be used by a session to execute statements. Sometimes there is a one to one relationship between CONNECTION->SESSION->PROCESS (eg: a normal dedicated server connection). Sometimes there is a one to many from connection to sessions (eg: like autotrace,one connection,two sessions,one process). A process does not have to be dedicated to a specific connection or session however,for example when using shared server (MTS),your SESSION will grab a process from a pool of processes in order to execute a statement. When the call is over,that process is released back to the pool of processes.
会话&链接
在具体的应用场景中连接(connction) 和 会话(session) 有很多情况: 1. SQL*PLUS 登录 ORACLE 这种场景比较容易理解,一个连接对应一个Session。 2. PL/SQL Developer工具登录ORACLE PL/SQL Developer工具――>首选项――>连接下,你可以设置会话方式,如下图所示: 如果设置选项选择多路会话,:PL/SQL Developer 登录ORACLE,每打开一个窗口,将创建一个新的会话,而设置选项选择单路会话,则新打开的窗口会共用一个会话。具体你可以参考PLSQL Developer8.0用户指南: 多路会话:每个测试窗口、SQL窗口和命令窗口都将有它自己的会话,另外的一个会话将被用于编译。这是最灵活的设置,明显地会导致最大数量的数据库会话。另外可能的缺点是,在更新被提交之后,它们只在X窗口中可以看到,而在Y窗口看不到。 双路会话:测试窗口、SQL窗口和命令窗口将共享一个会话,另外一个会话将被用于编译。这个模式的缺点是每次只有一个窗口可以运行程序。 单路会话:所有的窗口和所有的编译都使用同一个会话,这使事务管理变得很困难。在这个模式中调试器被禁用使用。如果你被限制只能使用一个数据库会话,那么你只能使用这个设置了。 会话&进程 在Oracle中如何查看参数sessiones或processes的值呢?一般使用show parameter命令查看。 SQL>showparameterprocesses; NAMETYPEVALUE ----------------------------------------------------------------------------------- aq_tm_processesinteger0 db_writer_processesinteger1 gcs_server_processesinteger0 job_queue_processesinteger10 log_archive_max_processesinteger2 processesinteger850 SQL>showparametersession; ------------------------------------------------------------------------------- java_max_sessionspace_sizeinteger0 java_soft_sessionspace_limitinteger0 license_max_sessionsinteger0 license_sessions_warninginteger0 logmnr_max_persistent_sessionsinteger1 session_cached_cursorsinteger20 session_max_open_filesinteger10 sessionsinteger940 shared_server_sessionsinteger SQL> 方法2:查询v$parameter selectname,type,value,display_value,isses_modifiable,issys_modifiable fromv$parameter wherename='sessions'; selectname,monospace;font-size:12pt;background-color:#FFFFFF;">fromv$parameter wherename='processes'; 方法3:查询v$resiyrce_limit; Oracle的sessions和processes的数量关系是: Oracle 11g R1以及之前版本 sessions=(1.1 * processes) + 5 Oracle 11g R2 sessions=(1.5 * processes) + 22 如下例子所示,在Oracle 10g 版本中,processes与sessions的关系如下所示: SQL>select*fromv$version; BANNER ---------------------------------------------------------------- OracleDatabase10gRelease10.2.0.4.0-64bitProduction PL/SQLRelease10.2.0.4.0-Production CORE10.2.0.4.0Production TNSforLinux:Version10.2.0.4.0-Production NLSRTLVersion10.2.0.4.0-Production SELECT (1.1 *850)+ 5 FROM DUAL; 其值刚好为940 一般修改参数processes后,sessions参数也会随之变化,但是有一个奇怪的现象时,如下所示,我将processes从 850改为120后,重启数据库实例,发现sessions的值并没有随之变化。这个现象一般发生在改小processes参数。为什么这样呢? 共享服务器模式,一个会话可能由多个服务进程轮流为之服务,一个进程可能为多个会话服务。简单地说,进程和会话之间有一种多对多的关系。 会话管理 1:查看当前所有用户的会话(SESSION): SELECT*FROMV$SESSION WHEREUSERNAMEISNOTNULL ORDERBYLOGON_TIME,SID; 其中Oracle内部进程的USERNAME为空 2:查看当前用户的所有SESSION: WHEREUSERNAME=USER 3:查看当前窗口/当前用户的会话信息SELECTSID,SERIAL#,STATUSFROMV$SESSIONWHEREAUDSID=USERENV('SESSIONID'); |