【问题标题】:connections are not closing in oracle database [closed]oracle数据库中的连接没有关闭[关闭]
【发布时间】:2014-09-11 13:49:50
【问题描述】:

问题 我们有一个 Java Web 应用程序连接到通过 Websphere 应用程序服务器配置的 Oracle 数据库。 连接是数据源连接,而不是普通的 jdbc 连接(DriverManager.getConnection(),所以不需要做 con.colse())。 连接池大小为 10。在数据库端打开的连接数超过 500。正在显示 v$session 表 超过 500 个连接处于打开状态。我们只通过一个用户连接到数据库。所有连接都属于一个 用户。我的问题是为什么在空闲时间或事务结束后连接没有关闭?大多数连接 空闲且不用于对数据库运行任何 sql 查询,但连接已打开。 这是 websphere 设置还是 Oracel DBA 设置?如何将 Websphere 配置为仅使用来自连接池的连接? 如何在会话结束时间或默认时间(例如 30 分钟)后终止连接,而不是手动进行 DBA Oracle 设置? 请帮忙 谢谢, 克里希纳 ekrishna10@gmail.com

【问题讨论】:

  • 你需要close()连接完成后。是什么让你不这么认为?
  • 感谢 Elliott Frisch,这是一个有点旧的应用程序,最近出现了连接问题。我检查了代码,我们通常在一种方法 closeJDBCObjects() 中关闭所有连接,并在 finally 块中创建新连接的所有位置调用。
  • 看看我的博文here。然后确保你按照你所说的去做。
  • 数据库方面的任何帮助,因为连接大部分时间都是空闲的,没有运行任何 sql,为什么 Oracle DB 不能在一段时间后关闭连接(会话时间或默认时间说30 分钟?如果有任何此类选项,请告诉我。
  • 咨询您的 DBA(或服务器故障)。你也可以定期重启你的应用服务器(有相应的停机时间)。

标签: java oracle jdbc datasource


【解决方案1】:

您使用数据源这一事实绝不意味着您的代码在完成连接后不需要关闭连接。无论您如何获得连接,都需要确保在完成连接后关闭连接。

例如,DataSource tutorial 明确指出您需要关闭连接并提出类似的建议

try {
    Connection con = ds.getConnection(username, password);
    // ... code to use the pooled
    // connection con
} catch (Exception ex {
    // ... code to handle exceptions
} finally {
    if (con != null) con.close();
}

【讨论】:

  • 感谢 Justin Cave,这是一个有点旧的应用程序,最近出现了连接问题。我检查了代码,我们通常在一种方法 closeJDBCObjects() 中关闭所有连接,并在 finally 块中创建新连接的所有位置调用。
  • @krishna - 如果应用程序服务器有 500 个到数据库的连接,并且中间层的连接池没有配置为需要 500 个连接,那么几乎可以肯定你不是在应用程序的某处正确关闭您的连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
相关资源
最近更新 更多