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



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

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

我认为我使用 readyStatement的方式可能有问题,因为我使用的 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 中传递带有"?"的参数?如何找出问题的根本原因?谢谢。

也许 jdbc 缓存有问题...甲骨文规范尝试将其关闭。或尝试重新初始化驱动程序几次(每天一次)

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

因此,我建议获取可靠的数据,以精确定位出现问题的层(JAVA或DB)。

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

当第一次诊断不良性能时,我总是使用"USE"方法,利用率,饱和度和错误。

因此,首先,在日志中查找错误。

然后查找任何饱和的资源(CPU、内存等)

最后看一下每个资源的利用率,拥有客户端服务器布局将使这更容易,如果不是这种情况,您将需要向下钻取到进程级别以了解其 Java 还是数据库。

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

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

最新更新