我正在研究基本代码,以便在数据库中访问警报系统。据我所知,工作中的数据库(基于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();
答案 0 :(得分:1)
每次客户端连接到数据库时,必须对连接进行身份验证。这显然是一个开销。此外,数据库侦听器只能同时处理有限数量的连接;如果同时连接尝试的次数超过该阈值,则将它们放入队列中。这也是一种开销。
所以一般的答案是,是的,打开和关闭连接是一项昂贵的操作。
答案 1 :(得分:1)
Oracle无法池连接,这必须在客户端完成
您没有关闭发布的代码示例中的任何连接
打开一个连接是一个相当缓慢的过程,因此使用一组固定的连接(通常该组具有胖客户端应用程序之类的大小为1)或连接池,它们会打开连接以便重用。有关连接池的可行选项,请参阅此问题:Connection pooling options with JDBC: DBCP vs C3P0如果您在应用程序服务器上运行,它可能已经提供了连接池解决方案。查看文档。
关闭代码中的结果集或连接(不在代码中)等内容应该在finally块中完成。关闭(以及正确的必要异常处理实际上相当困难。考虑使用像JdbcTemplate of Spring(http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html)
如果您不使用VPN(虚拟专用数据库)之类的东西,Oracle将缓存语句的执行计划,无论它们是否来自同一连接。最近访问的数据也保存在内存中,以使查询快速访问类似数据。因此,性能下降实际上来自建立连接的延迟。数据库端有一些开销用于创建理论上可能会影响整个数据库性能的连接,但这可能是无关紧要的。
答案 2 :(得分:0)
使用数据库连接池总是有益的,尤其是在使用Java EE应用服务器时。此外,使用Java EE应用服务器中开箱即用的连接池也是最佳选择,因为它将由App服务器开发团队进行优化和性能测试。