DB2 ERRORCODE 4499 SQLSTATE = 58009

时间:2014-11-19 11:41:30

标签: java spring hibernate db2 websphere

在我们的生产应用程序中,我们最近出现了来自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个元素时,hibernate选择成功。

我们的架构:

  • Spring 4.0.3
  • Hibernate 4.3.5
  • DB2 v10 z / Os
  • Websphere 7.0.0.31(使用JDBC V9.7FP5)

当我尝试在Data Studio中执行此操作或从Tomcat(连接到生产数据源)启动应用程序时,此选择有效。我认为Websphere上的数据源没有经过核心配置,但我尝试了一些修改而没有结果。我也尝试更新JDBC驱动程序,但没有帮助。实际上我变成了ERRORCODE = -1244。

好的,现在我正在寻找任何帮助;)。 显然,我可以在需要时提供其他信息。 也许有人早些时候对这个问题进行过辩护

提前致谢!

2 个答案:

答案 0 :(得分:1)

我们有相同的problem,最后通过在表上运行REORG和RUNSTAT来解决。在我们的案例中,数据库和表已损坏,并且在运行上述两个操作后,问题得以解决。

答案 1 :(得分:0)

  

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

带有320列的600万条记录似乎很难通过休眠方式一次性读取。您是如何尝试创建数据库游标并一次流式传输少量记录的?在普通的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

使用hibernate时,您需要以下代码

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中缓存结果,因此您需要经常调用session.flush()。如果您只是在阅读数据,可以考虑使用StatelessSession,但您应事先阅读其文档。

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