【问题标题】:How to avoid connection leak when program crashes程序崩溃时如何避免连接泄漏
【发布时间】:2018-02-02 10:14:02
【问题描述】:

我目前正在编写一个严重依赖于 JDBC 和与 Oracle 数据库的连接的 Java 应用程序。每当我连接到数据库时,我都会在 try-catch 块的 finally 块中关闭连接以避免连接泄漏。到目前为止,这工作得很好。

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

当然,这个崩溃一开始就不应该发生,但仍然非常不满意的是,这导致了连接泄漏,如果连接太多,我现在必须告诉 DBA 手动终止 JDBC 会话还开着。

【问题讨论】:

    标签: java oracle swing jdbc plsql


    【解决方案1】:

    一旦您失去了应用层和数据库层之间的握手,您将在尝试从应用层终止数据库会话时遇到一些严重的困难。

    使用提升的权限,您可能可以做一些花哨的事情,查询V$SESSION 视图并尝试找到您挂起的会话,这样您就可以使用JDBC 发送一些kill 命令(注意我说可能是因为我可以' t 保证 JDBC 驱动程序中存在这样的命令——事实上它可能不存在)。但我认为这将是严重的矫枉过正。

    我认为您更好的选择是使用 Oracle 的会话管理工具从数据库方面解决问题。在您连接的用户配置文件中将IDLE_TIME 参数设置为UNLIMITED 以外的其他内容,以便Oracle 自动SNIPES(终止)任何在指定时间段内空闲的连接。与您的 DBA 讨论它,他们应该能够为您设置...这是一个相当简单的调整(但请记住,您还需要将 RESOURCE_LIMIT 数据库参数设置为 TRUE 以将任何 IDLE_TIME 设置为被认出来。

    【讨论】:

    • 谢谢,与 DBA 讨论这似乎确实是个好主意。唯一的问题可能是,每当我的程序在我们公司之外运行时(它是一个 API 测试工具,可能对我们的客户来说很有趣),他们将面临同样的问题,并且必须对他们的数据库进行同样的调整,这可能会让他们怀疑程序的稳定性^^
    • 我不会太担心发送错误的信号。设置IDLE_TIME 是一种很好的连接池做法,尤其是当您有大量用户访问数据库时。一组用户可以通过打开连接然后在不关闭程序的情况下离开他们的机器来轻松地使数据库陷入困境。
    猜你喜欢
    • 2021-12-07
    • 2016-11-17
    • 2020-05-17
    • 2011-10-10
    • 1970-01-01
    • 2014-07-16
    • 2018-04-04
    • 2018-05-25
    • 1970-01-01
    相关资源
    最近更新 更多