代碼:RuntimeException - Exhausted Resultset - 它怎麼會發生?
// Start the query.
final ResultSet r = prepared.executeQuery();
try {
// Returning false from oneRow will stop the process.
boolean goOn = true;
while (r.next() && goOn) {
log.trace("Result: {}", toString(r));
// We did do at least one.
ran = true;
goOn = oneRow(r);
}
} finally {
try {
// Always remember to close the ResultSet.
r.close();
} catch (SQLException ex) {
log.error("Close failed", ex);
}
}
// Handle one row.
public boolean oneRow(ResultSet r) throws Exception {
String xml1 = r.getString(1);
String xml2 = r.getString(2);
if (xml1 == null && xml2 == null) {
// Probably compressed.
xml1 = decompress(r, 3);
xml2 = decompress(r, 4);
}
return false;
}
private static String decompress(ResultSet rs, int col) throws SQLException {
// Exception gets thrown here!!! ???
final InputStream compressed = rs.getBinaryStream(col);
...
正如你可以看到這是不是不叫ResultSet.next()
的明顯的問題。不僅如此,我還在ResultSet
中撥打了getString
兩次,這是第三次打破它。
請注意,這是一個偶然的問題,這段代碼大部分時間都正常工作。
查詢看起來像:
"SELECT P1.XML XML1, "
+ "P2.XML XML2, "
+ "P1.CompressedXML CompressedXML1, "
+ "P2.CompressedXML CompressedXML2 "
+ "FROM Table1 P1 "
+ "LEFT JOIN Table2 T2 ON T2.ID = P1.ID "
+ "LEFT JOIN Table1 P2 ON P2.ID = T2.Item_Code "
+ "WHERE P1.ID = ?"
我意識到這是一個相當亂倫的查詢,但正如我所說 - 這一切工作正常的大部分時間。
新增
通過張貼user1933888
答案促使它發生,我認爲,因爲我使用的是自家種的連接池有可能是一個準備好的聲明與自身之間的兩個線程共享不同的干擾連接?
我相信,同一連接永遠不會被兩個線程同時使用,但預備語句可以共享,因爲它應該駐留在數據庫中。
這可能是一些數據問題 –
你可以顯示堆棧跟蹤嗎? – beny23
還要注意,oneRow總是返回false,所以你永遠不會處理多於一行的數據。 – beny23