首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

从oracle临时表懂得会话与链接

2012-07-15 
从oracle临时表理解会话与链接用oracle时间比较长了,但只是单纯的使用,很少关心一些基本的东西,比如oracle

从oracle临时表理解会话与链接
用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允许存在失去了物理链接的会话,这个需要抽个时间测试一下,眼见为实,呵呵。
   
    今天就先写到这里,这只是我对链接和会话在实验的基础上的粗略理解,欢迎各位提出自己的高见,在此先行谢过。

热点排行