1

我正在编写一个基本代码来访问数据库中的警报系统查询。我知道工作中的数据库(基于 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();
4

3 回答 3

2
  1. Oracle 无法连接连接,这必须在客户端完成

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

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

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

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

于 2013-03-03T11:09:56.207 回答
1

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

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

于 2013-03-03T11:00:42.820 回答
0

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

于 2013-03-03T10:32:35.680 回答