网站模板 代码免费,常见的关键词,wordpress 子域名 函数,招生引流100个方法连接并不是会话的同义词#xff0c;发现这一点时很多人都很诧异。在大多数人眼里#xff0c;它们都是一样的#xff0c;但事实上并不一定如此。在一条连接上可以建立0个、一个或多个会话。各个会话是单独而且独立的#xff0c;即使它们共享同一条数据库物理连接也是如此。一…连接并不是会话的同义词发现这一点时很多人都很诧异。在大多数人眼里它们都是一样的但事实上并不一定如此。在一条连接上可以建立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、提交事务和运行存储过程。可以使用SQL*Plus来看一看实际的连接和会话是什么样子从中还可以了解到实际上一条连接有多个会话的情况相当常见。这里使用了AUTOTRACE命令并发现有两个会话。我们在一条连接上使用一个进程创建了两个会话。以下是其中的第一个会话sqlplus storm/unimasSQL select username, sid, serial#, server, paddr, status from v$session where username STORM;USERNAME SID SERIAL# SERVER PADDRSTATUS------------------------------ ---------- ---------- --------- -------- --------STORM 148 60 DEDICATED 30A1BDCC INACTIVESQL set autotrace on statisticsSP2-0618: Cannot find the Session Identifier. Check PLUSTRACE role is enabledSP2-0611: Error enabling STATISTICS reportSQL碰到错误原来是没有添加PLUSTRACE rolesqlplus sys/unimas as sysdbaSQL create role plustrace;Role created.SQL grant select on v_$sesstat to plustrace;Grant succeeded.SQL grant select on v_$statname to plustrace;Grant succeeded.SQL grant select on v_$mystat to plustrace;Grant succeeded.SQL grant plustrace to dba with admin option;Grant succeeded.SQL grant plustrace to STORM;Grant succeeded.重新登录stormSQL set autotrace on statisticsUSERNAME SID SERIAL# SERVER PADDRSTATUS------------------------------ ---------- ---------- --------- -------- --------STORM 141180 DEDICATED 30A1BDCC INACTIVESTORM 148 62 DEDICATED 30A1BDCC INACTIVESQL disconnect从技术上讲这个命令应该叫DESTROY_ALL_SESSIONS更合适而不是DISCONNECT因为我们并没有真正物理地断开连接。在SQL*Plus中要真正地断开连接应该执行“exit”命令因为你必须退出才能完全撤销连接。SQL select username, sid, serial#, server, paddr, status from v$session where username STORM;no rows selected可以看到这个账户名下没有会话但是仍有一个进程相应地有一条物理连接(使用前面的ADDR值)SQL select username, program from v$process where addr hextoraw(30A1BDCC);USERNAMEPROGRAM--------------- ------------------------------------------------oracleoraclehb (TNS V1-V3)SQL所以这就有了一条没有相关会话的“连接”。可以使用SQL*Plus的CONNECT命令(这个命令的名字也起得不恰当)在这个现有的进程中创建一个新会话(CONNECT命令叫CREATE_SESSION更合适)可以看到这个账户名下没有会话但是仍有一个进程相应地有一条物理连接(使用前面的ADDR值)SQL select username, sid, serial#, server, paddr, status from v$session where username STORM;USERNAME SID SERIAL# SERVER PADDRSTATUS------------------------------ ---------- ---------- --------- -------- --------STORM 153 58 DEDICATED 30A1BDCC INACTIVE可以注意到PADDR还是一样的所以我们还是在使用同一条物理连接但是(可能)有一个不同的SID。我说“可能有”是因为也许还会分配同样的SID这取决于在我们注销时是否有别人登录以及我们原来的SID是否可用。另外Serial# is in v$session. It is an Oracle generated value used incombination with the SID to create a unique session identifier.SID和SERIAL合起来能作为一个session的唯一标识。