2016-11-09 43 views
1

當啓動一個嵌入的HSQLDB有時記錄例外:檢測HSQLDB初始化失敗是由於腐敗

2016-11-08 10:35:27 INFO h.d.H.ENGINE user:NA company:NA remotehost:NA dataFileCache open start 
2016-11-08 10:35:27 INFO h.d.H.ENGINE user:NA company:NA remotehost:NA dataFileCache open end 
2016-11-08 10:35:31 ERROR h.d.H.ENGINE user:NA company:NA remotehost:NA statement error processing log /home/jetty/test/testdb/test.dbline: 87137 
org.hsqldb.HsqlException: user lacks privilege or object not found: PUBLIC.FROM 
     at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.error.Error.error(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.SchemaManager.getUserTable(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.scriptio.ScriptReaderText.processStatement(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.scriptio.ScriptReaderText.readLoggedStatement(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.persist.ScriptRunner.runScript(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.persist.ScriptRunner.runScript(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.persist.Log.processLog(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.persist.Log.open(Unknown Source) ~[hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.persist.Logger.openPersistence(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.Database.reopen(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.Database.open(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.DatabaseManager.getDatabase(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.DatabaseManager.newSession(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.jdbc.JDBCConnection.<init>(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.jdbc.JDBCDriver.getConnection(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at org.hsqldb.jdbc.JDBCDriver.connect(Unknown Source) [hsqldb-2.2.7.jar:2.2.7] 
     at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:95) [HikariCP-2.4.3.jar:na] 
     at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:101) [HikariCP-2.4.3.jar:na] 
     at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:314) [HikariCP-2.4.3.jar:na] 
     at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:171) [HikariCP-2.4.3.jar:na] 
     at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:436) [HikariCP-2.4.3.jar:na] 
     at com.zaxxer.hikari.pool.HikariPool.access$500(HikariPool.java:65) [HikariCP-2.4.3.jar:na] 
     at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:567) [HikariCP-2.4.3.jar:na] 
     at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:560) [HikariCP-2.4.3.jar:na] 
     at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.7.0_51] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_51] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_51] 
     at java.lang.Thread.run(Unknown Source) [na:1.7.0_51] 
2016-11-08 10:35:31 INFO h.d.H.ENGINE user:NA company:NA remotehost:NA checkpointClose start 
2016-11-08 10:35:31 INFO h.d.H.ENGINE user:NA company:NA remotehost:NA dataFileCache commit start 
2016-11-08 10:35:31 INFO h.d.H.ENGINE user:NA company:NA remotehost:NA checkpointClose end 
2016-11-08 10:35:32 INFO c.x.p.d.u.DataSourceFactory user:NA company:NA remotehost:NA Database connection is OK! 
2016-11-08 10:35:32 INFO c.x.p.d.u.DataSourceFactory user:NA company:NA remotehost:NA Initialising data source: Liquibase 
2016-11-08 10:35:32 INFO c.x.p.d.u.DataSourceFactory user:NA company:NA remotehost:NA HSQLDB used 

好像HSQLDB吞下這些異常。
這會導致我們的java代碼繼續運行,即使數據庫可能已損壞。

有沒有辦法來捕捉這些異常?
或者Java API調用來驗證數據庫是否正確啓動?

+0

你可以發佈你的代碼在哪裏訪問數據庫? – developer

+0

由於存在持久性問題,2.2.7版本很快被替換爲2.2.8。如果不是最新版本,至少要切換到該版本。 – fredt

+0

@javaguy我們不是晚上查詢數據庫呢。當HSQLDB被初始化時會發生這種情況。通過Hikari初始化HSQLDB: 'hikariConnPool.setDriverClassName(org.hsqldb.jdbcDriver.class.getName()); hikariConnPool.setJdbcUrl(「jdbc:hsqldb:」+ Configuration.databasePath);' – pietervi

回答

1

異常消息吹塑:

org.hsqldb.HsqlException: user lacks privilege or object not found: PUBLIC.FROM 

指示數據庫中的.log文件有一個在.log文件的87137線命名爲FROM表的引用。由於表格不能稱爲FROM,因此它顯示出存在損壞的線條。

當數據庫未正確關閉並且.log文件的最後一行未同步到磁盤時,可能會發生這種情況。引擎會忽略該點的.log文件條目。

您可以選擇將hsqldb.full_log_replay=true添加到連接屬性中,以拋出異常並中止連接嘗試。然後,您可以查看和編輯.log文件以刪除損壞的行。 如果你想