Tomcat Servlet中的SQL执行时间比普通Java程序慢得多

Tim*_*Tim 5 java performance tomcat6 ojdbc

但是由于种种原因,今天早上我的两个查询变得很慢,性能有所提高。我不知道为什么。
我对服务器没有权限,也许有人更改了某些内容。
问题不再存在

简而言之:

  • s.executeQuery(sql)在服务器上的tomcat servlet中运行非常慢
  • 在没有servlet(简单Java程序)的情况下,同一查询在同一台计算机上运行良好
  • 并非所有查询在Servlet中的速度都很慢。只有几个大的
  • 同一个servlet在另一台机器上快速运行

更新

请阅读文字下方的更新!

我有一个servlet执行SQL请求并通过JSON发送回结果的工具。由于某些原因,某些请求需要花费大量时间才能执行,但是当我在任何Oracle SQL Client中运行它们时,它们都不会立即执行。

我说的是同一SQL的1秒与5分钟的区别(不是那么复杂)。

如何解释呢?有没有一种方法可以提高基于Java的SQL请求的性能?

我正在使用执行查询的传统方式:

java.sql.Connection conn = null;
java.sql.Statement s = null;
ResultSet rs = null;

String dbDriver = "oracle.jdbc.driver.OracleDriver";
String dbConnectionString = "jdbc:oracle:thin:@" + dbHost + ":" + dbPort + ":" + dbSid;

Class.forName(dbDriver).newInstance();
conn = DriverManager.getConnection(dbConnectionString, dbUser, dbPass);
s = conn.createStatement();
s.setQueryTimeout(9999);
rs = s.executeQuery(newStatement);
ResultSetMetaData rsmd = rs.getMetaData();

// Get the results
while (rs.next()) {
// collect the results
}

// close connections
Run Code Online (Sandbox Code Playgroud)

我尝试使用ojdbc14和ojdbc6,但是没有区别。

更新1:我在客户端计算机上的本地Java项目(而不是servlet)中尝试了相同的SQL,然后立即获得结果。所以我认为问题出在我的servlet还是tomcat配置?

更新2:真正的罪魁祸首是rs = s.executeQuery(mySql); 我尝试改用prepareStatement,但是没有区别。

更新3:我创建了一个在本地Tomcat上运行的新Servlet,并且查询很快返回。因此,问题出在我的生产服务器或Tomcat配置上。任何想法什么配置项可能会影响这一点?

更新4:我在普通的Java程序中尝试了相同的代码,而不是servlet(仍在同一服务器上),并且结果很快。因此,问题来自Servlet本身(或Tomcat?)。仍然不知道该怎么办,但我把范围缩小了:)

更新5:Jstack显示以下内容(它从我的servlet所在的位置开始,其余部分我删除了)

    "http-8080-3" daemon prio=3 tid=0x00eabc00 nid=0x2e runnable [0xaa9ee000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:129)
        at oracle.net.ns.Packet.receive(Packet.java:311)
        at oracle.net.ns.DataPacket.receive(DataPacket.java:105)
        at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:305)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:249)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:171)
        at oracle.net.ns.NetInputStream.read(NetInputStream.java:89)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
        at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
        at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:429)
        at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:397)
        at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
        at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
        at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
        at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:30)
        at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:762)
        at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925)
        at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1104)
        at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1309)
        - locked <0xe7198808> (a oracle.jdbc.driver.T4CConnection)
        at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:422)
Run Code Online (Sandbox Code Playgroud)

所以我被困在java.net.SocketInputStream.socketRead0(Native Method)

Tim*_*Tim 0

然而,由于无法解释的原因,今天早上性能有所提高,我的问题不再存在。我不知道为什么。我对服务器没有权限,也许有人改变了一些东西。