Java Derby DB 错误“线程“index-stat-thread”中的异常”和“无法获得 JDBC 连接”错误

Posted

技术标签:

【中文标题】Java Derby DB 错误“线程“index-stat-thread”中的异常”和“无法获得 JDBC 连接”错误【英文标题】:Java Derby DB error 'Exception in thread "index-stat-thread"' and "Could not get JDBC Connection" error 【发布时间】:2013-12-26 13:20:40 【问题描述】:

我们有一个独立的单用户桌面应用程序,它具有 Swing 前端并使用嵌入式 Derby 数据库 (10.8.2.2 1181258)。 Spring(3.0.4)被用作应用程序和数据库之间的通道。使用 JRE 1.7.0_21 运行应用程序的客户(在希伯来语/以色列语言环境 iw_IL 中)遇到了问题。记录了以下堆栈跟踪:

ERROR [index-stat-thread] stderr - Exception in thread "index-stat-thread"    
ERROR [index-stat-thread] stderr - java.lang.ClassCastException: org.apache.derby.impl.store.access.btree.BranchControlRow cannot be cast to org.apache.derby.impl.store.access.btree.LeafControlRow    
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.store.access.btree.BTreeScan.positionAtNextPage(Unknown Source)  
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.store.access.btree.BTreeForwardScan.fetchRows(Unknown Source)  
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.store.access.btree.BTreeScan.fetchNextGroup(Unknown Source)  
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.services.daemon.IndexStatisticsDaemonImpl$KeyComparator.fetchRows(Unknown Source)  
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.services.daemon.IndexStatisticsDaemonImpl.updateIndexStatsMinion(Unknown Source)  
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.services.daemon.IndexStatisticsDaemonImpl.generateStatistics(Unknown Source)  
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.services.daemon.IndexStatisticsDaemonImpl.processingLoop(Unknown Source)  
ERROR [index-stat-thread] stderr -  at org.apache.derby.impl.services.daemon.IndexStatisticsDaemonImpl.run(Unknown Source)  
ERROR [index-stat-thread] stderr -  at java.lang.Thread.run(Thread.java:722)  

知道什么可能导致这样的错误吗?

随后,Spring 记录了以下内容:

org.springframework.jdbc.support.SQLErrorCodesFactory - Error while extracting database product name - falling back to empty error codes  
org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: No current connection.  
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:293)  
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:320)  
    at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:212)  
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.setDataSource(SQLErrorCodeSQLExceptionTranslator.java:141)  
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.<init>(SQLErrorCodeSQLExceptionTranslator.java:104)  
    at org.springframework.jdbc.support.JdbcAccessor.getExceptionTranslator(JdbcAccessor.java:99)  
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:602)  
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)  
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)  
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673)  
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713)  
    at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:796)  
    at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.queryForList(SimpleJdbcTemplate.java:235)  

鉴于应用程序在与应用程序相同的机器和文件系统上使用嵌入式 Derby 数据库,JDBC 连接错误令人费解。第一次德比失误会是造成这种情况的原因吗? 接下来是 Spring 在为一个表加载条目时出现的另一个错误,这似乎与 Derby 的第一个错误相同:

ERROR [main] org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [select * from XYZ where scresult_id=?]; SQL state [XJ001]; error code [0]; Java exception:   
'org.apache.derby.impl.store.access.btree.BranchControlRow cannot be cast to org.apache.derby.impl.store.access.btree.LeafControlRow: java.lang.ClassCastException'.;   nested exception is java.sql.SQLException: Java exception: 
'org.apache.derby.impl.store.access.btree.BranchControlRow cannot be cast to org.apache.derby.impl.store.access.btree.LeafControlRow: java.lang.ClassCastException'.

同一应用程序已被其他客户成功使用了几个月。这是客户第一次遇到这些问题。

【问题讨论】:

【参考方案1】:

您的数据库似乎已损坏。这些是您永远不应该看到的内部消息。

以下是有关如何使用备份和日志来恢复数据库的信息:http://db.apache.org/derby/docs/10.10/adminguide/cadminhubbkup98797.html

在恢复数据库之前,您应该保留损坏数据库的副本、derby.log 文件以及有关数据库损坏情况的任何其他信息,因为它们可能为您提供有关如何防止损坏的重要线索以后有这个问题。

一般来说,像这样破坏 Derby 数据库是不可能的;因此,出现这种情况可能表明 Derby 本身存在错误。但也可能有其他可能的解释,例如损坏或配置错误的硬件。

我从您最初的问题中假设您不知道如何重现此问题?在这种情况下,尽可能多地保留有关事件的信息,以及发生损坏时发生的事情(电源是否故障?机器是否硬重启?磁盘是否已满?是病毒 -检查器在机器上运行吗?有上百万个这样的问题要问......)可能会给你一些关于如何自己重现问题的线索。

【讨论】:

感谢 Bryan 的及时回复和有用的提示。您假设我们不知道如何重现问题是正确的。我们也怀疑数据库损坏,但不知道是否存在导致它的已知问题。

以上是关于Java Derby DB 错误“线程“index-stat-thread”中的异常”和“无法获得 JDBC 连接”错误的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis运行错误:信息: SQLErrorCodes loaded: [DB2, Derby, H2, HDB, HSQL, Informix, MS-SQL, MySQL, Oracle, P

SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]

Derby数据库的安装配置及使用

如果表不存在,如何使用 Derby Db 创建表

德比的Derby数据库

异常 SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]