JDBC结果集关闭

时间:2010-03-23 21:05:05

标签: 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.executeQuery();
              ......

    return xyz;
}
finally {
    try {
        if (rs != null) rs.close();
        if (ps != null) ps.close();
    }
    catch (SQLException sqlEx) {

    }
}

从JProfiler统计数据中,我发现仅此特定的resultspace.close()语句需要花费大量时间。它在25毫秒到320秒之间变化,而对于性质相同的其他代码块,我发现这需要接近20微秒。

为了确定,我多次运行此性能测试并确认了这些数据。我对这种行为感到困惑 - 想法?

4 个答案:

答案 0 :(得分:3)

此性能是特定于JDBC驱动程序的。 C3P0连接池不应对其产生任何影响。我建议用新的或另一个JDBC驱动程序重新测试它。 Sybase驱动程序的替代方法是jTDS driver。与Sybase驱动程序相比,我不确定这是如何执行的,但与Microsoft自己的MSSQL JDBC驱动程序相比,它已知非常性能。

与实际问题无关,您实际上应该在自己的close()块中调用try方法,否则无法保证它们所有都会被关闭。如果第一次关闭抛出SQLException,则不会执行后续关闭调用。 Apache Commons DbUtils可能有助于取消样板代码。

答案 1 :(得分:1)

在半相关的说明中,查看Apache Commons DbUtilsDbutils.closeQuietly()方法,以便以正确的顺序轻松管理连接/语句/结果集的关闭,并进行正确的异常处理。

答案 2 :(得分:0)

方法调用实际上是在延迟期间导致CPU负载还是只是等待?关闭ResultSet很可能涉及与数据库的远程通信,我的猜测是在某些情况下这可能需要一段时间。

答案 3 :(得分:0)

如果该语句是一个选择而您没有消耗所有数据,请尝试在关闭之前取消该语句。