【问题标题】:Do multiple open/close connections to SQl via Java effect performance?是否通过 Java 影响性能与 SQl 的多个打开/关闭连接?
【发布时间】:2013-02-17 13:06:03
【问题描述】:

我正在编写一个基本代码来访问数据库中的查询以获取警报系统。我知道工作中的数据库(基于 Oracle)会自动创建一个连接池,我想知道如果我每 5-15 秒连接、执行查询和 关闭连接,性能会急剧下降吗?这是正确的方法还是我必须保持连接打开直到无限循环关闭?

我有人告诉我,关闭连接会导致数据库每次都必须从头开始查找查询,但如果我让它保持打开状态,查询将在数据库某处的缓存中。

     ResultSet rs1 = MyStatement.executeQuery(QUERY_1);
     while (rs1.next()){
     // do something
     }
     rs1.close();

     rs1 = MyStatement.executeQuery(QUERY_2);
     while (rs1.next()){
     // do something
     }
     rs1.close();

【问题讨论】:

  • Oracle 不会自动创建连接池。并且上面的代码不会关闭任何连接。它只关闭结果集。
  • 我同意@JBNizet :您的示例代码没有说明您提出的问题。所以,投票结束。

标签: java sql oracle jdbc


【解决方案1】:
  1. Oracle 无法共享连接,这必须在客户端完成

  2. 您在发布的代码示例中没有关闭任何连接

  3. 打开连接是一个相当缓慢的过程,因此请使用一组固定的连接(通常该组的大小为 1,用于胖客户端应用程序之类的东西)或连接池,它将打开的连接汇集起来以供重用。有关连接池的可行选项,请参阅此问题:Connection pooling options with JDBC: DBCP vs C3P0 如果您在应用程序服务器上运行,它可能已经提供了连接池解决方案。检查文档。

  4. 关闭代码中的结果集或连接(不在代码中)之类的东西应该在 finally 块中完成。关闭(并且正确处理必要的异常实际上是相当困难的。考虑使用类似 Spring 的 JdbcTemplate (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html)

  5. 如果您不使用 VPN(虚拟私有数据库)之类的东西,Oracle 将缓存语句的执行计划,无论它们是否来自同一个连接。最近访问的数据也保存在内存中,以便快速访问类似数据的查询。所以性能下降实际上来自建立连接的延迟。在数据库端创建连接有一些开销,理论上这可能会影响整个数据库的性能,但这可能是无关紧要的。

【讨论】:

【解决方案2】:

每次客户端连接到数据库时,都必须对连接进行身份验证。这显然是开销。此外,数据库监听器只能同时处理有限数量的连接;如果同时连接尝试的数量超过该阈值,它们将被放入队列中。这也是开销。

所以一般的答案是,是的,打开和关闭连接是一项昂贵的操作。

【讨论】:

    【解决方案3】:

    使用数据库连接池总是有益的,尤其是在您使用 Java EE 应用服务器时。此外,使用 Java EE 应用服务器中开箱即用的连接池也是最佳选择,因为它将由应用服务器开发团队进行优化和性能测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      相关资源
      最近更新 更多