为了测试应用程序的健壮性,故意对正常连接的Pro*C应该程序进行了中断,从而观察它们的表现。
测试的方法为:
1、在编译Pro*C应用的时候加上cpool=no或cpool=yes,测试有连接池和没连接池的不同表现;
2、启动应用程序后等待输入,将流程挂起;
3、在数据库中查询此测试程序的SESSION:
SELECT *
FROM v$session
WHERE program='TestConnPool.exe';
|
4、生成杀掉Session的代码:
SELECT 'alter system kill session ''' || sid || ',' || serial# || ''';' |
5、执行SQL杀掉SESSION:
alter
system
kill
session '23,1308';
…..
|
6、按任意键让应用程序继续执行,查看错误信息。
7、发生错误的时候尝试重新连接。
以下是各种情况下的测试结果:
测试情况
|
调用时的错误码
|
能否重连
|
不使用连接池,使用kill session人为断开连接 |
ORA-00028 your session has been killed
|
能
|
使用连接池,使用kill session人为断开所有连接 | ORA-03114: 未连接到 ORALCE |
不能。连接池被破坏,只有重启进程。重新连接的时候显示这个错误:
ORA-00022 invalid session ID; access denied
|
使用连接池,使用kill session人为断开连接池连接 |
不报错。很奇怪的现象,照理说物理连接都被断开了,结果仍然能够正常执行。
|
|
使用连接池,使用kill session人为断开非连接池连接 |
ORA-03114: 未连接到 ORALCE
|
能。
|
不使用连接池,拔掉网线后恢复网络连接
|
ORA-12571:TNS:packet writer failure
|
能。这个错误是客户端错误,重新连接后创建了新的SESSION,旧的SESSION仍在ORACLE的SESSION列表中。(猜想如果应用程序频繁崩溃和重启,可能导致ORACLE的连接耗尽)
|
使用连接池,拔掉网线后恢复网络连接
|
ORA-12571:TNS:packet writer failure
|
能。ORACLE重新创建了连接池的物理连接,但是没有创建新的逻辑连接。
|