DB2 错误代码 4499 SQLSTATE=58009



在我们的生产应用程序上,我们最近出现了来自 DB2 的奇怪错误:

Caused by: com.ibm.websphere.ce.cm.StaleConnectionException: [jcc][t4][2055][11259][4.13.80] The database manager is not able to accept new requests, has terminated all requests in progress, or has terminated your particular request due to an error or a force interrupt. ERRORCODE=-4499, SQLSTATE=58009

当 hibernate 尝试从一个大表中选择数据(超过 6 百万条记录和 320 列)时,会发生这种情况。我观察到,当 ResultSet 低于 10 个元素时,休眠会成功选择。

我们的架构:

  • 春季 4.0.3
  • 休眠 4.3.5
  • DB2 v10 z/OS
  • Websphere 7.0.0.31(使用 JDBC V9.7FP5)

当我尝试在数据洞察中执行此操作时,或者当应用程序从Tomcat(连接到生产数据源)本地启动时,此选择有效。我想 Websphere 上的数据源不是直接配置的,但我尝试了一些修改但没有结果。我还尝试更新JDBC驱动程序,但这没有帮助。实际上我变成了错误代码= -1244。

好的,所以现在我正在寻找任何帮助;)。我显然可以在需要时提供其他信息。也许有人早些时候与这个问题作斗争?

提前感谢!

我们遇到了同样的问题,最终通过在表上运行 REORG 和 RUNSTAT 来解决。在我们的例子中,数据库和表被损坏,在运行上述两个操作后,它解决了。

当休眠尝试从一个大表中选择数据(超过 6 百万条记录和 320 列)时,会发生这种情况

600 万条记录,320 列,通过 Hibernate 一次读取似乎很大。您如何尝试创建数据库游标并一次流式传输几条记录?在普通的 JDBC 中,它按如下方式完成

Statement stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
                java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(50); //fetch only 50 records at a time

在使用休眠时,您将需要以下代码

Query query = session.createQuery(query);
query.setReadOnly(true);
query.setFetchSize(50);
ScrollableResults results = query.scroll(ScrollMode.FORWARD_ONLY);
// iterate over results
while (results.next()) {
    Object row = results.get();
    // process row then release reference
    // you may need to flush() as well
}
results.close();

这允许您流式传输结果集,但是 Hibernate 仍将在会话中缓存结果,因此您需要每隔一段时间调用session.flush()。如果只读取数据,则可以考虑使用 StatelessSession ,尽管应事先阅读其文档。

分析使用此方法时数据库表锁定的影响。

最新更新