Я использую 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/[email protected]:1521:DBNAME");
} catch (Exception e) {
e.printStackTrace();
throw new DBConnectionException();
}
return conn;
}
соединение с частью БД:
...
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
}
Затем вызовите запросы. Я верю, что где-то в вашем коде либо вы закрываете соединение, либо соединение становится нулевым, почему вы столкнулись с этой проблемой.
ура
commit()
транзакцию вручную после создания запроса SP?