gpt4 book ai didi

java - RuntimeException - 耗尽结果集 - 怎么会发生?

转载 作者:行者123 更新时间:2023-12-01 13:42:54 25 4
gpt4 key购买 nike

代码:

    // 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发布的答案的提示下,我想到,由于我使用的是本地连接池,准备好的语句是否有可能在共享不同连接的两个线程之间干扰自身?

我相信同一个连接永远不会同时被两个线程使用,但准备好的语句可以共享,因为它应该驻留在数据库中。

最佳答案

由于您的PreparedStatement链接到一个连接,如果您在线程之间共享PreparedStatement,您最终将共享一个连接,这肯定会导致问题。

确实,语句通常会缓存在数据库中以避免重新解析它,但每个线程仍然需要一个PreparedStatement 对象,以避免数据库驱动程序混淆哪个线程想要什么。

一般来说,我会避免使用家庭酿造连接池,因为通常应用程序服务器会为您进行池化,或者(如果您不在应用程序服务器中)有大量的连接池库,那么为什么要重新发明轮子呢? 。

一般来说:

  • 您可以在并发线程之间共享数据源
  • 不应在并发线程之间共享 Connection、PreparedStatement 或 ResultSet 对象

连接池将确保非并发线程可以重用连接,并且 JDBC 驱动程序将在内部缓存语句

希望这是有道理的。

关于java - RuntimeException - 耗尽结果集 - 怎么会发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20564532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com