嵌入式 Derby 在因中断异常关闭父进程并删除文件时崩溃

问题描述 投票:0回答:1

我们使用 Derby derby-10.14.2.0 以及 openjdk 1.8.0_402。 当我们关闭父进程时,derby DB 有时会给出中断异常并删除其“DO NO TOUCH”文件和属性文件,并且它不会再次恢复,我们必须手动删除数据库并重新启动。这会导致存储在数据库中的数据丢失。

以下是日志片段

错误08000:连接因未知中断而关闭。 在 org.apache.derby.iapi.error.StandardException.newException(来源未知) 在 org.apache.derby.iapi.error.StandardException.newException(来源未知) 在 org.apache.derby.iapi.util.InterruptStatus.setInterrupted(来源未知) 在 org.apache.derby.iapi.util.InterruptStatus.throwIf(来源未知) 在 org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.checkCancellationFlag(来源未知) 在 org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCore(来源未知) 在 org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(来源未知) 在 org.apache.derby.impl.sql.execute.ScalarAggregateResultSet.getRowFromResultSet(来源未知) 在 org.apache.derby.impl.sql.execute.ScalarAggregateResultSet.getNextRowCore(来源未知) 在 org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(来源未知) 在 org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(来源未知) 在 org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(来源未知) 在 org.apache.derby.impl.jdbc.EmbedResultSet.next(来源未知) 在 org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207) 在 org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207) 在org.apache.commons.dbcp.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:659) 在 org.apache.commons.dbcp.PoolableConnectionFactory.validateObject(PoolableConnectionFactory.java:635) 在 org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1165) 在 org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) 在org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)

片段2

5 月 24 日星期五 15:01:23 IST 2024:关闭 Derby 引擎 5 月 24 日星期五 15:01:23 IST 2024 主题[,5,main] 错误 XJ001:Java 异常:“:org.apache.derby.shared.common.error.ShutdownException”。 java.sql.SQLException:Java异常:':org.apache.derby.shared.common.error.ShutdownException'。 在 org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(来源未知) 在 org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(来源未知) 在 org.apache.derby.impl.jdbc.Util.seeNextException(来源未知) 在 org.apache.derby.impl.jdbc.Util.javaException(来源未知) 在 org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(来源未知) 在 org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(来源未知) 在 org.apache.derby.impl.jdbc.EmbedConnection.handleException(来源未知) 在 org.apache.derby.impl.jdbc.EmbedConnection.commit(来源未知) 在 org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334) 在 org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334) 在 org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.commit(PoolingDataSource.java:211)

Derby 应在关闭时保留数据。

derby
1个回答
0
投票

您需要在主进程终止之前关闭 Derby,请参阅此处

DriverManager.getConnection("jdbc:derby:;shutdown=true");

这将关闭所有数据库和 Derby 引擎!

还有:

干净关闭总是会抛出SQL异常XJ015,可以忽略。

© www.soinside.com 2019 - 2024. All rights reserved.