2017-08-24 39 views
2

我目前正在编写一个Java应用程序,它很大程度上依赖于JDBC和与Oracle数据库的连接。每当我连接到数据库时,我都会关闭try-catch块的finally块中的连接,以避免连接泄漏。这工作得很好,直到现在。如何在程序崩溃时避免连接泄漏

但是现在我的程序因为什么原因而崩溃。在PLSQL Developer中,我仍然可以观察到一个开放的JDBC瘦客户端连接。我现在的问题是:如何关闭JDBC连接,当我不得不通过任务管理器杀死我的应用程序?

当然,这个崩溃不应该发生在第一位,但它仍然非常不令人满意,这导致了连接泄漏,我现在不得不告诉DBA手动杀死JDBC会话,如果太多连接仍然开放。

回答

1

一旦你失去了应用程序层和数据库层之间的握手,你将遇到一些严重的困难,试图从应用程序层中终止你的数据库会话。

以高特权,你也许可以做到,你查询V$SESSION视图花哨的东西,并设法找到你挂会话,以便您可以发送使用JDBC一些kill命令(注意我说的威力,因为我不能保证类似的命令存在于JDBC驱动程序中 - 实际上它可能不会)。但我认为这将是严重的矫枉过正。

我认为你最好的选择是使用Oracle的会话管理工具从数据库端解决问题。将您正在连接的用户配置文件中的IDLE_TIME参数设置为除UNLIMITED以外的其他值,以便Oracle自动将SNIPES(终止)空闲指定时间段内的任何连接。谈谈你的DBA一下,他们应该能够集这件事对你......这是一个相当简单的调整(但是请记住,你还需要设置TRUERESOURCE_LIMIT数据库参数来识别任何IDLE_TIME设置。

+0

谢谢,与DBA谈论这确实是一个好主意。唯一的问题可能是,只要我的程序运行在我们公司之外(它是一个API测试工具,可能对我们的客户很有意思),他们会面对同样的问题,将不得不作出相同的调整他们的数据库,这可能会使他们怀疑程序的稳定性^^ – Phreneticus

+0

我不会太担心发送错误的信号。设置'IDLE_TIME'是一个很好的连接特别是如果您有大量用户访问数据库时进行联合练习一群用户可以通过打开连接然后离开他们的机器而不关闭程序来轻易地阻止数据库。 – DanK