JDBC程序运行长时间性能问题

时间:2012-06-15 16:47:21

标签: linux performance oracle jdbc java

我的程序存在Oracle查询性能问题,我相信SQL具有良好的性能,因为它在SQLPlus中快速返回。

但是当我的程序运行了很长时间(例如1周)时,SQL查询(使用JDBC)变得更慢(在我的日志中,查询时间比我最初启动程序时要长得多)。当我重新启动程序时,查询性能恢复正常。

我认为使用preparedStatement的方式可能有问题,因为我使用的SQL不使用占位符“?”一点都不只是一个复杂的选择查询。

查询过程由util类完成。以下是构建查询的相关代码:

public List<String[]> query(String sql, String[] args) {
    Connection conn = null;
    conn = openConnection();
    conn.setAutocommit(true);
    ....
    PreparedStatement preStatm = null;
    ResultSet rs = null;
    ....//set preparedstatment arg code 
    rs = preStatm.executeQuery();
      ....
    finally{
           //close rs
           //close prestatm
           //close connection
     }
 }

在我的例子中,args始终为null,因此它只是将查询sql传递给此查询方法。这种方式可能会在程序长时间运行后减慢数据库查询吗?或者我应该使用语句,或者只是用“?”传递args。在SQL中?如何找出问题的根本原因?感谢。

2 个答案:

答案 0 :(得分:1)

jdbc缓存中可能存在问题...... oracle spec 尝试将其关闭。 或尝试重新启动驱动程序一次(每天一次)

答案 1 :(得分:0)

首先需要查看有助于您了解自己花费大部分时间的数据的数据,在性能调整时猜测不是一种选择。

所以我建议获取固定数据,指出提出问题的层(JAVA或DB)。

为此,我建议在问题最明显时查看AWR和ASH报告。还可以在JVM上收集数据(您可以使用JConsole和/或JVisualVM)。

当第一次诊断不良表现时,我总是做&#34;使用&#34;方法,利用率,饱和度和误差。

首先,查看日志中的错误。

然后查找任何资源变为饱和(CPU,内存等...)

最后看看每个资源的利用率,拥有客户端服务器布局会使这更容易,如果不是这种情况,则需要深入到流程级别以了解其Java或DB。

收集完这些数据后,您可以相应地指导您的调整工作。采用这种方法只会让你浪费时间,有时甚至会掩盖问题或引发新问题。

您可以稍后再回来查看这些数据,我们可以看看!