我使用OJDBC(v7)
连接到Oracle(11g)
,Java
。
在某些大型表格中,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 **/
...
}
为什么?!
答案 0 :(得分:0)
在try catch块中使用:
if ((cnn==null)||cnn.isClosed()){
cnn=DB.getDBConnection(); //e.g. DB is instance of class where getDBConnection() resides
}
然后调用查询。我相信你的代码中某处要么正在关闭连接,要么连接变为空,这就是你遇到这个问题的原因。
干杯