Java 程序崩溃时如何避免连接泄漏
我目前正在编写一个Java应用程序,它严重依赖于JDBC和到Oracle数据库的连接。无论何时连接到数据库,我都会关闭try-catch块的finally块中的连接,以避免连接泄漏。到目前为止,这一切都很顺利 但现在我的程序因为任何原因崩溃了。在PLSQLDeveloper中,我仍然可以观察到一个开放的JDBC瘦客户机连接。我现在的问题是:当我必须通过任务管理器终止应用程序时,如何关闭JDBC连接Java 程序崩溃时如何避免连接泄漏,java,oracle,swing,jdbc,plsql,Java,Oracle,Swing,Jdbc,Plsql,我目前正在编写一个Java应用程序,它严重依赖于JDBC和到Oracle数据库的连接。无论何时连接到数据库,我都会关闭try-catch块的finally块中的连接,以避免连接泄漏。到目前为止,这一切都很顺利 但现在我的程序因为任何原因崩溃了。在PLSQLDeveloper中,我仍然可以观察到一个开放的JDBC瘦客户机连接。我现在的问题是:当我必须通过任务管理器终止应用程序时,如何关闭JDBC连接 当然,这个崩溃本来就不应该发生,但仍然很令人不满意的是,这导致了连接泄漏,现在我不得不告诉DBA手
当然,这个崩溃本来就不应该发生,但仍然很令人不满意的是,这导致了连接泄漏,现在我不得不告诉DBA手动终止JDBC会话,如果仍有太多连接处于打开状态。一旦失去了应用程序层和数据库层之间的握手,您将在尝试从应用程序层终止数据库会话时遇到严重困难 有了提升的权限,您可能可以在查询
V$SESSION
视图并尝试查找挂起的会话时做一些奇特的事情,这样您就可以使用JDBC
发送一些kill命令(注意,我说可能是因为我不能保证JDBC驱动程序中存在这样的命令,事实上它可能不存在)。但我认为那将是严重的过度杀伤力
我认为更好的选择是使用Oracle的会话管理工具从数据库端解决这个问题。在要连接到的用户配置文件中,将
IDLE\u TIME
参数设置为UNLIMITED
以外的内容,以便Oracle自动SNIPES
(终止)在指定时间段内处于空闲状态的任何连接。和你的DBA讨论一下,他们应该可以为你设置这个。。。这是一个相当简单的调整(请记住,您还需要将RESOURCE\u LIMIT
数据库参数设置为TRUE
,以便识别任何IDLE\u TIME
设置。谢谢,与DBA讨论这一点确实是一个好主意。唯一的问题可能是,每当我的程序在公司之外运行时(这是一个API测试工具,可能会让我们的客户感兴趣),他们将面临同样的问题,并将不得不对其数据库进行同样的调整,这可能会使他们对程序的稳定性产生怀疑^^^我不会太担心发送错误的信号。设置空闲时间
是一种很好的连接池做法,尤其是当您有大量用户时一组用户打开连接,然后离开他们的机器而不关闭程序,同样可以很容易地使数据库陷入困境。