Java ResultSet.next()占用的时间太多,记录太少
我在Java ResultSet.next()占用的时间太多,记录太少,java,oracle,resultset,ojdbc,Java,Oracle,Resultset,Ojdbc,我在Java中使用OJDBC(v7)连接到Oracle(11g)。 在某些情况下,在一些大表上,Resultset无法在适当的时间获取数据 例如,输出记录只有2条,但在Resultset.next()上,java冻结并等待太长时间 注1:问题不在于设置FetchSize(),RsultSet.TypeX,而不是使用连接池,如c3p0我已经测试了所有这些。 注2:另外,当我直接在navicat中运行查询时,结果显示得非常完美 获取连接方法: public Connection getDBConne
Java
中使用OJDBC(v7)
连接到Oracle(11g)
。
在某些情况下,在一些大表上,Resultset
无法在适当的时间获取数据
例如,输出记录只有2条,但在Resultset.next()上,
java冻结并等待太长时间
注1:问题不在于设置FetchSize()
,RsultSet.TypeX
,而不是使用连接池,如c3p0
我已经测试了所有这些。
注2:另外,当我直接在navicat
中运行查询时,结果显示得非常完美强>
获取连接方法:
public Connection getDBConnection() throws DBConnectionException {
Connection conn = null;
String connectionUrl;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:user/pass@xxx.xxx.xxx.xxx:1521:DBNAME");
} catch (Exception e) {
e.printStackTrace();
throw new DBConnectionException();
}
return conn;
}
连接到DB部件:
...
conn = connectionManager.getDBConnection();
conn.setAutoCommit(false);
String query = "{call ...(...)}";
CallableStatement stmt = conn.prepareCall(query,ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(10000);
.
.
.
stmt.registerOutParameter(x, OracleTypes.CURSOR);
stmt.execute();
Resultset rs = (ResultSet) stmt.getObject(x);
while (rs.next()) { /** Problem occurs here **/
...
}
为什么 在try-catch块中使用:
if ((cnn==null)||cnn.isClosed()){
cnn=DB.getDBConnection(); //e.g. DB is instance of class where getDBConnection() resides
}
然后调用查询。我相信在代码中的某个地方,要么关闭连接,要么连接变为空,这就是您面临此问题的原因
干杯在创建SP query调用后,您是否真的手动提交了事务?在客户端应用程序和JDBC中运行时,您是否比较了查询计划?可能是客户端应用程序使用FIRST_ROWS(x)提示,但JDBC使用ALL_ROWS模式,执行计划不同,并且客户端返回行的速度比JDBC快。