【发布时间】:2012-06-18 18:39:40
【问题描述】:
我的程序在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 传递给这个查询方法。在程序长时间运行后,这种方式可能会减慢数据库查询的速度吗?或者我应该改用语句,或者只是用“?”传递参数在 SQL 中?如何找出问题的根本原因?谢谢。
【问题讨论】:
-
性能下降可能与您的代码没有释放资源有关(例如:关闭连接)。
-
@Alfabravo,感谢您的评论。但是我已经在finally块中一一关闭了连接资源,你的意思是,还有其他地方不能关闭连接或者释放资源吗?
-
是的。另一个选项是构建查询的方式。可以给我们看看吗?
-
您是否监控过 Oracle 的会话?连接总是关闭吗?当系统变慢时,在
v$session上进行选择,看看有多少活动会话。 -
@Alfabravo,对不起,SQL 包含了太多的业务信息,我不能在这里发布,但我们转向查询计划。应该没问题,我发现一旦数据库空闲(周末,没有人使用系统),它会运行得非常快。不确定这是否意味着什么。
标签: linux performance oracle jdbc java