我正在编写一个基本代码来访问警报系统数据库中的查询。我知道工作中的数据库(基于 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 无法池化连接,这必须在客户端完成
您没有关闭您发布的代码示例中的任何连接
打开连接是一个相当缓慢的过程,因此请使用一组固定的连接(对于胖客户端应用程序,通常该组的大小为 1)或一个连接池,它将打开的连接汇集起来以供重用。请参阅此问题以了解连接池的可行选项:Connection pooling options with JDBC: DBCP vs C3P0如果您在应用程序服务器上运行,它可能已经提供了连接池解决方案。查看文档。
关闭诸如代码中的结果集或连接(不在您的代码中)之类的东西应该在 finally block 中完成。进行关闭(以及正确的必要异常处理实际上相当困难。考虑使用类似 Spring 的 JdbcTemplate ( http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html )
如果您不使用 VPN(虚拟专用数据库)之类的东西,Oracle 将缓存语句的执行计划,无论它们是否来自同一连接。最近访问的数据也保存在内存中,以使查询访问类似数据的速度更快。所以性能下降实际上来自建立连接的延迟。在数据库端创建连接会产生一些开销,理论上这会影响整个数据库的性能,但很可能无关紧要。
关于java - 通过 Java 对 SQl 的多个打开/关闭连接会影响性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15184697/