我正在对我的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.executeQuery();
......
return xyz;
}
finally {
try {
if (rs != null) rs.close();
if (ps != null) ps.close();
}
catch (SQLException sqlEx) {
}
}
从JProfiler统计数据中,我发现仅此特定的resultspace.close()语句需要花费大量时间。它在25毫秒到320秒之间变化,而对于性质相同的其他代码块,我发现这需要接近20微秒。
为了确定,我多次运行此性能测试并确认了这些数据。我对这种行为感到困惑 - 想法?
答案 0 :(得分:3)
此性能是特定于JDBC驱动程序的。 C3P0连接池不应对其产生任何影响。我建议用新的或另一个JDBC驱动程序重新测试它。 Sybase驱动程序的替代方法是jTDS driver。与Sybase驱动程序相比,我不确定这是如何执行的,但与Microsoft自己的MSSQL JDBC驱动程序相比,它已知非常性能。
与实际问题无关,您实际上应该在自己的close()
块中调用try
方法,否则无法保证它们所有都会被关闭。如果第一次关闭抛出SQLException
,则不会执行后续关闭调用。 Apache Commons DbUtils可能有助于取消样板代码。
答案 1 :(得分:1)
在半相关的说明中,查看Apache Commons DbUtils和Dbutils.closeQuietly()方法,以便以正确的顺序轻松管理连接/语句/结果集的关闭,并进行正确的异常处理。
答案 2 :(得分:0)
方法调用实际上是在延迟期间导致CPU负载还是只是等待?关闭ResultSet很可能涉及与数据库的远程通信,我的猜测是在某些情况下这可能需要一段时间。
答案 3 :(得分:0)
如果该语句是一个选择而您没有消耗所有数据,请尝试在关闭之前取消该语句。