0

我把“localDb.commit();” 在每个“localDb.compact();”之前 但仍然得到例外:

线程“Thread-0”java.lang.IllegalAccessError 中的异常:WAL 不为空;先提交,然后在 org.mapdb.StoreDirect.compact(StoreDirect.java:810) 的 org.mapdb.EngineWrapper.compact(EngineWrapper.java:130) 的 org.mapdb.StoreWAL.compactPreUnderLock(StoreWAL.java:1100) 进行压缩在 org.mapdb.EngineWrapper.compact(EngineWrapper.java:130) 在 org.mapdb.DB.compact(DB.java:1626)

我的 commit()、compact() 位于 Thread.run() 中,我的 DBMaker 配置为:

DB localDb = DBMaker.newFileDB(new File(filename)).closeOnJvmShutdown().make();

存储大小:471M,包括*.compact、*.compact.p、*.p、*.t java -version: java version "1.8.0_11" uname -r: 2.6.32-279.el6.x86_64

谢谢!

4

1 回答 1

0

https://github.com/jankotek/MapDB/issues/463

我通过同事的代码审查找到了原因。我将 commit() / compact() 放入消费者线程,将 queue.offer() 放入由 servlet 调用的生产者线程是我的错;所以“queue.offer()”可以在“commit()”和“compact()”之间调用。

于 2015-03-31T07:56:43.873 回答