2

我正在对我的 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

4 回答 4

3

这种性能是特定于 JDBC 驱动程序的。C3P0 连接池应该不会对其产生任何影响。我建议使用更新的或其他 JDBC 驱动程序重新测试它。Sybase 驱动程序的替代方案是jTDS 驱动程序。我不确定它与 Sybase 驱动程序相比性能如何,但与 Microsoft 自己的 MSSQL JDBC 驱动程序相比,它的性能众所周知。

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

于 2010-03-23T21:15:30.990 回答
1

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

于 2010-03-23T22:22:46.667 回答
0

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

于 2010-03-23T21:08:20.043 回答
0

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

于 2010-03-24T15:00:36.973 回答