Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 长时间运行的JDBC程序性能问题_Linux_Performance_Oracle_Jdbc_Java - Fatal编程技术网

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

Linux 长时间运行的JDBC程序性能问题,linux,performance,oracle,jdbc,java,Linux,Performance,Oracle,Jdbc,Java,我的程序在Oracle查询性能方面有问题,我相信SQL有很好的性能,因为它在SQLPlus中返回得很快 但是,当我的程序运行了很长一段时间(比如1周)后,SQL查询(使用JDBC)会变慢(在我的日志中,查询时间比我最初启动程序时长得多)。当我重新启动程序时,查询性能恢复正常 我认为我使用preparedStatement的方式可能有问题,因为我使用的SQL根本不使用占位符“?”。只是一个复杂的select查询 查询过程由一个util类完成。以下是构建查询的相关代码: public List<

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

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

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

查询过程由一个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
     }
 }
公共列表查询(字符串sql,字符串[]args){
连接conn=null;
conn=openConnection();
conn.setAutocommit(正确);
....
PreparedStatement=空;
结果集rs=null;
..//set PreparedStation参数代码
rs=prestam.executeQuery();
....
最后{
//近距离
//闭式自动取款机
//密切联系
}
}

在我的例子中,args总是空的,所以它只是将一个查询sql传递给这个查询方法。在程序长时间运行后,这种方法是否可能会降低DB查询的速度?或者我应该改为使用语句,或者只在SQL中传递带“?”的参数?如何找出问题的根本原因?谢谢。

jdbc缓存中可能有问题。。。 试着把它关掉。
或者尝试重新控制驱动程序几次(每天一次)

您首先需要查看数据,以帮助您了解您在哪里花费了大部分时间,而在性能调整时,猜测不是一个选项

因此,我建议您获取可靠的数据,这些数据指出了问题所在的层(JAVA或DB)

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

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

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

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

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

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


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

性能下降可能与您的代码没有释放资源有关(例如:关闭连接)。@Alfabravo,谢谢您的评论。但是我已经在finally块中一个接一个地关闭了连接资源,你是说,还有其他地方可能无法关闭连接或取消释放资源?是的。另一个选项是构建查询的方式。你能给我们看看吗?你监控过Oracle的会话吗?连接总是关闭的吗?当系统变慢时,在
v$session
上进行选择,看看有多少活动会话。@Alfabravo,对不起,SQL包含了太多的业务信息,我不能在这里发布,但我们正在寻找查询计划。应该没问题,我发现一旦数据库空闲(周末,没有人使用系统),它就会运行得非常快。不确定这是否意味着什么。谢谢你的回答,如何用纯jdbc摆脱它?我们使用的是一个简单的JDBC备用应用程序,没有web容器来维护数据源。那你对司机的报复是什么意思?怎么做?你的意思是重新加载Oracle驱动程序类吗?我也有同样的问题。经过一周半的搜索,我发现OracleJDBCDataSource已经打开了缓存。禁用它后,该延迟(我运行了一百万次select查询,延迟出现在十万次之后)消失,查询以固定时间运行。