我的程序存在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中?如何找出问题的根本原因?感谢。
答案 0 :(得分:1)
jdbc缓存中可能存在问题...... oracle spec 尝试将其关闭。 或尝试重新启动驱动程序一次(每天一次)
答案 1 :(得分:0)
首先需要查看有助于您了解自己花费大部分时间的数据的数据,在性能调整时猜测不是一种选择。
所以我建议获取固定数据,指出提出问题的层(JAVA或DB)。
为此,我建议在问题最明显时查看AWR和ASH报告。还可以在JVM上收集数据(您可以使用JConsole和/或JVisualVM)。
当第一次诊断不良表现时,我总是做&#34;使用&#34;方法,利用率,饱和度和误差。
首先,查看日志中的错误。
然后查找任何资源变为饱和(CPU,内存等...)
最后看看每个资源的利用率,拥有客户端服务器布局会使这更容易,如果不是这种情况,则需要深入到流程级别以了解其Java或DB。
收集完这些数据后,您可以相应地指导您的调整工作。采用这种方法只会让你浪费时间,有时甚至会掩盖问题或引发新问题。
您可以稍后再回来查看这些数据,我们可以看看!