Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC结果集关闭_Java_Performance_Jdbc_C3p0 - Fatal编程技术网

Java JDBC结果集关闭

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

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


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

方法调用是在延迟期间导致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。他们写得比你好。嗯-数据库在不同地理位置的一个偏远位置。然而,在代码库中有很多这样的语句,它们似乎执行得很好——只有这个特定的代码块似乎有问题。