在我们的生产应用程序中,我们最近出现了来自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选择成功。
我们的架构:
当我尝试在Data Studio中执行此操作或从Tomcat(连接到生产数据源)启动应用程序时,此选择有效。我认为Websphere上的数据源没有经过核心配置,但我尝试了一些修改而没有结果。我也尝试更新JDBC驱动程序,但没有帮助。实际上我变成了ERRORCODE = -1244。
好的,现在我正在寻找任何帮助;)。 显然,我可以在需要时提供其他信息。 也许有人早些时候对这个问题进行过辩护
提前致谢!
答案 0 :(得分:1)
我们有相同的problem,最后通过在表上运行REORG和RUNSTAT来解决。在我们的案例中,数据库和表已损坏,并且在运行上述两个操作后,问题得以解决。
答案 1 :(得分:0)
带有320列的600万条记录似乎很难通过休眠方式一次性读取。您是如何尝试创建数据库游标并一次流式传输少量记录的?在普通的JDBC中,它完成如下当hibernate尝试从一个大表(超过6个百万记录和320列)中选择数据时会发生这种情况
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
,但您应事先阅读其文档。
使用此方法分析数据库表锁定影响。