我的应用程序中存在以下问题,连接到Oracle 10g数据库:
当我的客户端崩溃,或者通过任务管理器终止进程,或者客户端暂时失去连接时,v $ session视图中的相应条目仍然存在。
现在,当我使用sqlplus连接到数据库时,我通过任务管理器终止了sqlplus.exe,会话条目几乎立即被删除。
由于各种原因,我的申请会优先考虑后期行为。
sqlplus做了哪些不同的事情,我可以在我自己的应用程序中做到吗?
答案 0 :(得分:2)
SQL * Plus使用OCI - Oracle Call Interface。这是一个广泛的API(超过四百个函数调用.OCI提供了许多处理连接和会话的方法。我不确定但我猜测SQL * Plus使用OCILogon2()为用户注册一个专用会话,并在会话句柄中添加一些内容,使其能够检测会话ABEND的时间。
因此,您的应用程序可能没有使用OCI来连接数据库。如果您想了解有关OCI的更多信息,可以阅读文档。警告它是相当低级别的东西! Find out more.
答案 1 :(得分:1)
您可以在sqlnet.expire_time=minutes_to_check
中设置$ORACLE_HOME/network/admin/sqlnet.ora
;它不会像oci那样瞬间完成,但它会清除死亡的连接。
答案 2 :(得分:1)
进一步的研究表明,尽管sqlplus在杀死进程时表现不同,但实际上当网络电缆插入一秒钟时它的行为方式相同=>悬空会议将保留在服务器上。
我现在创建了一个限制为idle_time
的用户个人资料,该用户个人资料已分配给我需要的用户。后台线程发送“keepalive”查询以使PMON保持连接不被SNIPED
。
如果您对我所做的事情感兴趣,请查看我的其他问题Oracle: idle_time appears to be ignored,并查看有关使idle_time
工作所需操作的答案。