Java Derby DB 错误 'Exception in thread "索引统计线程 "' and "无法获取 JDBC 连接”错误

标签 java spring derby

我们有一个独立的单用户桌面应用程序,它具有 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 连接错误令人困惑。第一次 Derby 失误可能是造成这种情况的原因吗?
接下来是加载一个表的条目时来自 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'.

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

最佳答案

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

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

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

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

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

关于Java Derby DB 错误 'Exception in thread "索引统计线程 "' and "无法获取 JDBC 连接”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20785619/

相关文章:

java - 没有找到合适的驱动程序..仍然

java - 使用 Rob Camick 的 ListTableModel,但未显示 JTable

java - 如何允许多个用户同时连接到我的 H2 数据库?

java - 是否可以在 String 中声明 Java 中的默认参数?

java - 检测并删除外部库中未使用的类

java - 使用 mockito 在另一个 spring 服务中模拟服务

java - 将使用 Jsp、Servlet 和 mySQL 构建的 Web 应用程序转换为使用 Spring 和 Hibernate 构建的 Web 应用程序很难吗?

java - 在java客户端中更改derbyDB架构 'on the fly'

java - Java进程内存大小和堆大小的区别

java - 如何在运行时在 Spring Boot 中重新加载嵌入式 Tomcat?