2

我的程序在 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 始终为空,因此它只是将查询 sql 传递给此查询方法。在程序长时间运行后,这种方式可能会减慢数据库查询的速度吗?或者我应该改用语句,或者只用“?”传递参数 在 SQL 中?如何找出问题的根本原因?谢谢。

4

2 回答 2

1

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

于 2012-06-15T22:28:09.447 回答
0

您首先需要查看可以帮助您了解您花费最多时间的数据,在性能调整时猜测不是一种选择。

因此,我建议获取可靠的数据来确定存在问题的层(JAVA 或 DB)。

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

第一次诊断不良性能时,我总是使用“使用”方法,即利用率、饱和度和错误。

所以首先,在日志中查找错误。

然后寻找任何变得饱和的资源(CPU、内存等...)

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

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

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

于 2014-07-11T21:39:17.197 回答