
2.3 数据库连接(connection)与会话(session)
连接与会话是Oracle数据库中容易混淆的两个概念,它们是紧密相关的两个概念。下面讲解它们的区别,给出实际的例子以帮助读者更好地理解它们的概念。
2.3.1 数据库连接(connection)
连接指用户进程与数据库服务器之间的通信途径,一个连接可以有多个对话。Oracle提供了如下三种数据库连接方式,以满足用户不同的连接需求。
● 基于主机的方式(Host-Based):此方式中,服务器和客户端运行在同一台计算机上,用户可以直接连接数据库服务器。
● 基于客户机_服务器的方式(Client-Server):该方式中数据库服务器和客户端运行在不同的计算机上,客户通过网络连接数据库服务器。在DBA的日常维护中,会经常使用这种方式访问数据库,实现数据库的远程维护。
● 用户-应用服务器-数据库服务器方式(Client-Application Server-Server):这种方式被称为三层访问模式,用户首先访问应用服务器,然后由应用服务器连接数据库服务器,应用服务器就如一个中介,完成客户和数据库的交互。在很多应用系统中,客户的应用程序往往通过三层方式访问数据库,如应用服务器为IIS或Apache服务器等。
2.3.2 会话(session)
会话指一个明确的数据库连接。在2.3.1小节中讲解了用户与数据库服务器建立连接的三种方式,一旦用户采用一种连接方式,我们把这样的连接称为一个会话。
如用户通过某种工具如SQL*PLUS在专用连接的情况下访问数据库,在输入的用户名和密码经过服务器验证后,服务器就会自动创建一个与该用户进程对应的服务器进程,二者是一对一的关系,这里服务器进程就像用户进程的代理,代替用户进程像数据库服务器发出各种请求,并把从数据库服务器获得的数据返回给用户进程。但用户退出或发生异常时(操作系统重启)会话结束。
注意
刚才指出“专有连接”的概念,专有连接是一种连接类型,指用户和服务器进程之间是一对一的关系。而在共享服务器配置的情况下,多个用户进程可以同时共享服务器进程,此时就不是专有连接,而是多对一的关系。
一个用户可以并发地建立多个会话,例子2-1就是用户sys同时在专有连接的情况下建立两个会话的例子。
例子2-1 用户SYS通过专有连接建立两个会话
SQL>SELECT serial#,username,status,server,process,program,logon_time 2* FROM v$session SERIAL# USERNAME STATUS SERVER PROCESS PROGRAM LOGON_TIME ----------- -------------------- ----------- ----------------- ---------------- --------------- ---------------------- 1 ACTIVE DEDICATED 2172 Oracle.EXE 17-5月 -09 1 ACTIVE DEDICATED 528 Oracle.EXE 17-5月 -09 1 ACTIVE DEDICATED 2188 Oracle.EXE 17-5月 -09 1 ACTIVE DEDICATED 408 Oracle.EXE 17-5月 -09 1 ACTIVE DEDICATED 1424 Oracle.EXE 17-5月 -09 1 ACTIVE DEDICATED 1244 Oracle.EXE 17-5月 -09 1 ACTIVE DEDICATED 2264 Oracle.EXE 17-5月 -09 3 SYS ACTIVE DEDICATED 540:1644 sqlplus.exe 17-5月-09 7 SYS ACTIVE DEDICATED 1296:1848 sqlplusw.exe 17-5月-09 已选择9行。
在例子2-1的输出中我们同时使用两个SQLPLUS工具连接数据库,并且使用同一个用户SYS,可以看到最后两行显示有两个活跃(ACTIVE)的会话,一个会话是使用sqlplus.exe程序建立的,一个是使用sqlplusw.exe程序建立的。
说明
在上述查询中,只是演示一个用户可以建立多个连接,使用相同或不同的工具登录。至于v$session(数据字典视图),读者暂且把它看成是一张表,表中存储了当前会话的信息,如属性USERNAME是用户登录名,属性PROGRAM是用户登录工具(一个用户进程)。
图2-4清晰地说明了连接与会话之间的区别和联系。

图2-4 连接与会话示意图
说明
一个连接可以对应多个对话,连接仅仅是一种通信途径,如通过Socket建立通信,但是一个用户可以启动多个进程通过一个连接建立多个对话,这里服务器进程就像是用户进程的代理一样,与服务器交互完成数据的各种操作。