|
用oracle时间比较长了,但只是单纯的使用,很少关心一些基本的东西,比如oracle中会话和链接的区别,我懒得看一大堆的介绍,只是看了oracle临时表的用法,实际测试了一下,之后才明白了这二者的区别,我想用这种方法理解这两者的区别比看N篇介绍更加印象深刻。
这里先不说会话和链接的区别和关系,首先看看oracle的会话级临时表,会话级临时表有这样的特性:当你当前SESSION 不退出的时候,临时表中的数据是存在的,而当你退出当前SESSION 之后,临时表中的数据就全部被清空了,换句话说,如果你不退出当前SESSION(这里简称 session a)而是用另一个SESSION(这里简称 session b)登录,是看不到session a中插入到临时表中的数据的,如果session a不退出,它里面建立的临时表的数据就会一直存在,直到它退出会话才被清除。
一个简单的例子即可印证,在这个例子中清楚的体现了链接和会话的关系和区别。
我们用sys用户登录并记录下当前有哪些会话,我使用的是plsqldev这种数据库工具,显示查询结果比较美观,方便
在plsqldev中打开一个命令窗口执行:
select sid,logon_time,username,machine from v$session order by logon_time
得到的结果是:
SQL> select sid,to_char(logon_time,'yyyy-mm-dd hh24:mi:ss'),username,machine from v$session order by logon_time desc;
;
SID TO_CHAR(LOGON_TIME,'YYYY-MM-DD USERNAME MACHINE
---------- ------------------------------ ------------------------------ ----------------------------------------------------------------
316 2011-03-10 00:56:37 6AA448B035B94BC
308 2011-03-10 00:56:22 SYS WORKGROUP\6AA448B035B94BC
317 2011-03-10 00:56:09 SYS WORKGROUP\6AA448B035B94BC
303 2011-03-09 21:32:50 DBSNMP WORKGROUP\6AA448B035B94BC
297 2011-03-09 21:31:59 6AA448B035B94BC
301 2011-03-09 21:31:51 SYSMAN 6AA448B035B94BC
298 2011-03-09 21:31:51 SYSMAN 6AA448B035B94BC
313 2011-03-09 21:31:50 6AA448B035B94BC
306 2011-03-09 21:31:50 SYSMAN 6AA448B035B94BC
319 2011-03-09 21:31:39 6AA448B035B94BC
334 2011-03-09 21:31:16 6AA448B035B94BC
333 2011-03-09 21:31:16 6AA448B035B94BC
332 2011-03-09 21:31:16 6AA448B035B94BC
331 2011-03-09 21:31:16 6AA448B035B94BC
330 2011-03-09 21:31:16 6AA448B035B94BC
329 2011-03-09 21:31:16 6AA448B035B94BC
328 2011-03-09 21:31:16 6AA448B035B94BC
327 2011-03-09 21:31:16 6AA448B035B94BC
326 2011-03-09 21:31:16 6AA448B035B94BC
335 2011-03-09 21:31:16 6AA448B035B94BC
325 2011-03-09 21:31:16 6AA448B035B94BC
21 rows selected
SQL>
并且我记录了我打开plsqldev并登录的时间是2011-03-10 00:56,所以我想上面查询结果中的307、308和316会话就是我打开plsqldev并登录成功,并且执行了查询时,创建的两个会话。
然后我开始创建oracle会话级临时表
SQL> insert into tst_session_table values (1,'name1');
1 row inserted
SQL> insert into tst_session_table values (2,'name2');
1 row inserted
SQL> commit;
Commit complete
在当前命令窗口中查一下结果:
SQL> select * from tst_session_table;
F_ID F_NAME
--------------------------------------- --------------------
1 name1
2 name2
SQL>
可以看到这个表中以经有数据了,暂且认为这是当前会话中保存的数据。
在plsqldev中重新打开一个命令窗口执行刚才的查询:
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as SYS
SQL> select * from tst_session_table;
F_ID F_NAME
--------------------------------------- --------------------
SQL>
可以看到表里没有数据,我再切回到刚才的那个窗口,执行查询仍然可以查到数据,明显这两个窗口各有一个不同的会话,符合了oracle会话级临时表的特性。
这是再看一下当前会话表的情况
SQL> select sid,to_char(logon_time,'yyyy-mm-dd hh24:mi:ss'),username,machine from v$session order by logon_time desc;
SID TO_CHAR(LOGON_TIME,'YYYY-MM-DD USERNAME MACHINE
---------- ------------------------------ ------------------------------ ----------------------------------------------------------------
311 2011-03-10 01:00:05 SYS WORKGROUP\6AA448B035B94BC
316 2011-03-10 00:59:52 6AA448B035B94BC
308 2011-03-10 00:56:22 SYS WORKGROUP\6AA448B035B94BC
317 2011-03-10 00:56:09 SYS WORKGROUP\6AA448B035B94BC
303 2011-03-09 21:32:50 DBSNMP WORKGROUP\6AA448B035B94BC
297 2011-03-09 21:31:59 6AA448B035B94BC
298 2011-03-09 21:31:51 SYSMAN 6AA448B035B94BC
301 2011-03-09 21:31:51 SYSMAN 6AA448B035B94BC
313 2011-03-09 21:31:50 6AA448B035B94BC
306 2011-03-09 21:31:50 SYSMAN 6AA448B035B94BC
319 2011-03-09 21:31:39 6AA448B035B94BC
325 2011-03-09 21:31:16 6AA448B035B94BC
326 2011-03-09 21:31:16 6AA448B035B94BC
327 2011-03-09 21:31:16 6AA448B035B94BC
328 2011-03-09 21:31:16 6AA448B035B94BC
329 2011-03-09 21:31:16 6AA448B035B94BC
335 2011-03-09 21:31:16 6AA448B035B94BC
331 2011-03-09 21:31:16 6AA448B035B94BC
332 2011-03-09 21:31:16 6AA448B035B94BC
333 2011-03-09 21:31:16 6AA448B035B94BC
334 2011-03-09 21:31:16 6AA448B035B94BC
330 2011-03-09 21:31:16 6AA448B035B94BC
22 rows selected
SQL>
发现311会话是新增的,明显这和新打开的sql窗口有关.
如果不查询一下 v$session,猛然看起来是有点奇怪,明明没有退出plsqldev,只是打了一个新的命令窗口而已,其实这个结果恰恰解释了链接和会话的关系以及区别,看看下面的分析:
当用plsqldev工具sys用户成功登录之后会建立一个连接,每当我在plsqldev打开一个窗口就并且执行了DDL或DML操作就会创建1个新的会话,不清楚其他的操作是否也是如此,但是推想一下,如果是关于数据库的操作,不建立会话,客户端如何操作oracle呢,所以肯定也是要建立新的会话,这个有待以后求证。
现在我关闭了最后打开的命令窗口,再查一下当前所有会话情况:
发现311会话不见了。因此可以断定以下结果:
1. 311会话是一个新的会话
2. 316会话中向临时表插入了数据
3. 317和308这两个会话是plsqldev工具自己建立的会话,可能有别的用途
316会话和317会话两个不同的会话,tst_session_table表数据的有无明显的体现了这一点。
总结一下:
当oracle客户端和服务端的链接建立之后,会在链接的基础上建立若干的会话,之后oracle客户端与oracle服务端都会在一个连接(不一定是在同一个会话中)中进行交互,因此链接和会话是1对多的关系。有的资料上将oracle允许存在失去了物理链接的会话,这个需要抽个时间测试一下,眼见为实,呵呵。
今天就先写到这里,这只是我对链接和会话在实验的基础上的粗略理解,欢迎各位提出自己的高见,在此先行谢过。 |
|
|