Tim*_*Tim 5 java performance tomcat6 ojdbc
但是由于种种原因,今天早上我的两个查询变得很慢,性能有所提高。我不知道为什么。
我对服务器没有权限,也许有人更改了某些内容。
问题不再存在。
简而言之:
请阅读文字下方的更新!
我有一个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)?