本篇介绍的是Oracle数据库中Session和Connection的区别。
在Oracle的官方文档上,对Session和Connection是这样解释的:
- Connection: Communicate pathway between a client process and an Oracle database instance.
连接:一个客户端进程和Oracle数据库实例之间的通信链路。
- Session: A logical entity in the database instance memory that represnts the state of a current user login to a database. A single connection can have 0, 1 or more sessions established on it.
会话:用于展示当前登录到数据库用户的状态的数据库实例内存中的一个逻辑实体。一个单独的连接可以有0,1,或者更多的会话。
事实上,Connection并不是直接建立在用户进程和数据库实例之间的。而是在用户进程和Server Process(服务器进程)之间的,因此有一个Connection就一定会有一个用户进程和一个服务器进程。但不一定会存在Session(下面的实验会证明这一点)。
我们通过实验来看下:
实验一,登录数据库(用SYS用户),通过查询V$SESSION视图得知相关的会话信息,而查询V$PROCESS视图得知相关的连接信息(如果连接不存在,那么服务器端的那个Server Process也一定不存在;反之亦然)。如下显示:
SQL> select username, sid, serial#, server, paddr, status from v$session where username='SYS';
USERNAME SID SERIAL# SERVER PADDR STATUS
-------------------- ---------- ---------- --------- -------- --------
SYS 1 77 DEDICATED <span style="background-color: rgb(255, 255, 102);">85465354</span> ACTIVE
SQL> select username, pid, serial#, program, terminal, addr from v$process where <span style="color:#000000;background-color: rgb(255, 255, 102);">addr='85465354'</span>;
USERNAME PID SERIAL# PROGRAM TERMINAL ADDR
--------------- ---------- ---------- ------------------------------------ ------------- --------
oracle 33 44 oracle@node1.example.com (TNS V1-V3) UNKNOWN 85465354
因此,我们可以知道,当我们登录时,它会帮我们创建一个Connection和Session。在V$SESSION视图中,paddr字段表示服务器进程的地址,也就是会话所在的连接的那个服务器进程。
实验二,如果此时我新开窗口登录数据库(用HR用户),同样地,我可以在上面这两个视图中查到这个用户的会话和连接信息。
SQL> select username, sid, serial#, server, paddr, status from v$session where username='HR';
USERNAME SID SERIAL# SERVER PADDR STATUS
------------------------------ ---------- ---------- --------- -------- --------
HR 57 2873 DEDICATED 85463DA4 INACTIVE
SQL> select username,pid,serial#,program,terminal,addr from v$process where addr='85463DA4';
USERNAME PID SERIAL# PROGRAM TERMINAL ADDR
--------------- ---------- ---------- ------------------------------------------------ --------- --------
oracle 31 128 oracle@node1.example.com (TNS V1-V3) UNKNOWN 85463DA4
现在我们尝试断开HR用户的这个会话,在查看这两个视图中的信息是否存在。
SQL> disconnect;
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
SQL> select username,sid,serial#,server,paddr,status from v$session where username='HR';
no rows selected
SQL> select username,pid,serial#,program,terminal,addr from v$process where addr='85463DA4';
USERNAME PID SERIAL# PROGRAM TERMINAL ADDR
--------------- ---------- ---------- ----------------------------------------- ---------- --------
oracle 31 128 oracle@node1.example.com (TNS V1-V3) UNKNOWN 85463DA4
由此实验,我们可以验证,在会话断开以后,连接仍然存在。
总结,这里我们用一个比喻来形容这个两个。如果需要将东西从A运到B,Connection可以看成是一座“桥”,而卡车把东西从A运到B后并返回A,这就是Session。所以,只要不断开连接,我随时都可以在这个连接上创建出会话。