SELECT * FROM log@link_1;
SELECT * FROM log@link_2;
SELECT * FROM log@link_3;
SELECT * FROM log@link_4;
SELECT * FROM log@link_5;
第五个数据连接报错:ORA-02020: 过多的数据库链接在使用中。经过一番测试发现log表的数据量比较大,有上万条记录,在执行语句之后 commit和rollback图标就成了高亮形式,一旦第5个也会变成高亮图标之前就会报错 又经过测试,发现选取的记录达到26条及以上时就会出现高亮的commit和rollbak图标,低于26条则不会出现。但是在(tool:PL/SQL Developer→command window)下测试的时候并不报错。
SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<27;
LEVEL
----------
1
2
...
26
SQL> SELECT LEVEL FROM dual@link_2 CONNECT BY LEVEL<27;
LEVEL
----------
1
2
...
26
SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<27;
LEVEL
----------
1
2
...
26
SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<27;
LEVEL
----------
1
2
...
26
SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<27;
LEVEL
----------
1
2
...
26
并没有发生报错的情况,同时commit和rollback的图标也没有发生变化,使用for update选项来进行测试 (tool PL/SQL developer→command window)
SQL> SELECT LEVEL FROM dual@dblink_1 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@dblink_2 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE;
SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE
ORA-02020: 过多的数据库链接在使用中
这次错误出现了,网上查到解决的办法:alter session close database link link_name,但是在执行之后发现报错
SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<1 FOR UPDATE;
SQL> ALTER SESSION CLOSE DATABASE LINK link_1;
ALTER SESSION CLOSE DATABASE LINK link_1
OORA-02080: 数据库链接正在使用中
看到这个错误,我这里实际出错的情况是存储过程当中多个合并查询连接不同的数据库,才出现了错误,于是继续测试:
SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<1 FOR UPDATE;
SQL> SELECT LEVEL FROM dual@link_2 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> ALTER SESSION CLOSE DATABASE LINK link_1;
OORA-02080: 数据库链接正在使用中
依然还是报错,这说明并不是多个以上在使用以后才能够关闭数据连接,他们并不存在依赖关系。 由于是commit和rollback图标点亮之后才出现的错误,于是我先尝试对每一条语句执行后进行提交或回滚操作:
SQL> SELECT LEVEL FROM dual@link_1 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> ROLLBACK;
Rollback complete
SQL> SELECT LEVEL FROM dual@link_2 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> ROLLBACK;
Rollback complete
SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> COMMIT;
Commit complete
SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> ROLLBACK;
Rollback complete
SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> COMMIT;
Commit complete
SQL> SELECT LEVEL FROM dual@link_6 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> ROLLBACK;
Rollback complete
使用了6个数据连接并没有发生报错的情况,而这个时候使用关闭数据连接的语句也不起作用
ALTER SESSION CLOSE DATABASE LINK link_1
ORA-02081: 数据库链接未打开
最后进行一次测试,这次才恍然大悟:
SQL> SELECT LEVEL FROM dual@dblink_1 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@dblink_2 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@link_3 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> COMMIT;
Commit complete
SQL> ALTER SESSION CLOSE DATABASE LINK dblink_1;
Session altered
SQL> ALTER SESSION CLOSE DATABASE LINK dblink_2;
Session altered
SQL> ALTER SESSION CLOSE DATABASE LINK link_3;
Session altered
SQL> SELECT LEVEL FROM dual@link_4 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> SELECT LEVEL FROM dual@link_5 CONNECT BY LEVEL<1 FOR UPDATE;
LEVEL
----------
1
SQL> COMMIT;
Commit complete
SQL> ALTER SESSION CLOSE DATABASE LINK link_4;
Session altered
看到这里,相信大家也明白了吧,也能够很容易的得出结论:
1.26条以上的记录并且在sql window窗口下(存储过程里面也一样)超过4个数据库连接,才会发生错误,如果没有达到26条记录,那么放心的使用多个数据库连接吧,不会有什么影响。
2.使用alter session关闭数据连接的前提是已经有4个以内的数据库连接”被使用“(相信大家已经明白 被使用是什么概念)并且最近被使用的数据连接已经被提交或者回滚的情况下可以使用,否则会出现”ORA-02080: 数据库链接正在使用中“的错误