Java JDBC结果集关闭
我正在对我的Java应用程序进行评测,发现了一些关于jdbc PreparedStatement调用的有趣统计信息: 环境详情如下: 数据库:Sybase SQL Anywhere 10.0.1 驱动程序:com.sybase.jdbc3.jdbc.SybDriver 连接池:c3p0 JRE:1.6.0_05 有关守则如下:Java JDBC结果集关闭,java,performance,jdbc,c3p0,Java,Performance,Jdbc,C3p0,我正在对我的Java应用程序进行评测,发现了一些关于jdbc PreparedStatement调用的有趣统计信息: 环境详情如下: 数据库:Sybase SQL Anywhere 10.0.1 驱动程序:com.sybase.jdbc3.jdbc.SybDriver 连接池:c3p0 JRE:1.6.0_05 有关守则如下: try { ps = conn.prepareStatement(sql); ps.setDouble(...); rs = ps.execute
try {
ps = conn.prepareStatement(sql);
ps.setDouble(...);
rs = ps.executeQuery();
......
return xyz;
}
finally {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
}
catch (SQLException sqlEx) {
}
}
从JProfiler统计数据中,我发现这个特殊的resultspace.close()语句本身就需要大量的时间。它从25毫秒到320秒不等,而对于性质相同的其他代码块,我发现这需要将近20微秒
为了确定,我多次运行了这个性能测试并确认了这个数据。我对这种行为感到困惑-想法?方法调用是在延迟期间导致CPU负载,还是只是等待?关闭结果集很可能涉及到与数据库的远程通信,我猜在某些情况下这可能需要一段时间。此性能取决于JDBC驱动程序。C3P0连接池不应对其产生任何影响。我建议使用更新的或其他JDBC驱动程序重新测试它。Sybase驱动程序的另一种替代方法是。我不确定与Sybase驱动程序相比,它的性能如何,但与Microsoft自己的MSSQL JDBC驱动程序相比,它的性能非常好
与实际问题无关,实际上您应该在自己的
try
块中调用close()
方法,否则不能保证它们都会被关闭。如果第一次关闭抛出SQLException
,则不会执行后续的关闭调用。可能有助于删除样板代码。在半相关注释中,请检查并了解以正确的顺序和正确的异常处理轻松管理关闭连接/语句/结果集的方法。如果该语句是select语句,并且您没有使用所有数据,请尝试在关闭该语句之前取消该语句。您执行哪种SQL:INSERT/UPDATE/select/Stored procedure调用?有自动提交吗?您写过其他快速运行的代码块:它是否仅在SQL中有所不同,还是存在其他差异?关于您的代码的一条注释:您应该在单独的try块中调用“close()”方法,否则为“ps.close()”不确定是否会被调用,您甚至不会注意到,因为没有处理潜在的异常。@Michal:SQL是一个简单的select语句@香蕉王:说得好我们正在重构SpringJDBC的代码,所以我希望它能处理好。320秒?320s可能是DNS超时?TCP/IP的生存时间(TTL)不会超过255s。您是否在所有情况下都完全使用结果集(即调用rs.next(),直到它不再返回任何内容)?感谢您的提示-我将尝试使用新的驱动程序。关于代码注释,我们已经计划好了将此代码迁移到Spring JDBC的开发案例。多个try
块还将允许您摆脱null
混乱。不,我不同意Tom Hawtin的观点,并建议使用静态方法来关闭。将这些close语句包装在各个try/catch块中,并检查是否为null。或者只使用SpringJDBC。他们写得比你好。嗯-数据库在不同地理位置的一个偏远位置。然而,在代码库中有很多这样的语句,它们似乎执行得很好——只有这个特定的代码块似乎有问题。