2015-03-19 2 views
0

Я положил «localDb.commit();» перед каждым "localDb.compact();" но все еще получаю исключение:java.lang.IllegalAccessError: WAL не пуст; перенесите сначала, чем compact

Exception in thread "Thread-0" java.lang.IllegalAccessError: WAL not empty; commit first, than compact at org.mapdb.StoreWAL.compactPreUnderLock(StoreWAL.java:1100) at org.mapdb.StoreDirect.compact(StoreDirect.java:810) at org.mapdb.EngineWrapper.compact(EngineWrapper.java:130) at org.mapdb.EngineWrapper.compact(EngineWrapper.java:130) at org.mapdb.DB.compact(DB.java:1626)

Мой коммит(), компактный() расположены в Thread.run(), и моя конфигурация DBMaker является: размер

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

магазин: 471M, в том числе * .compact * .compact.p * .p * .t Java -версия: Java версии "1.8.0_11" uname -r: 2.6.32-279.el6.x86_64

Спасибо!

ответ

0

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

I found the reason via my colleague's code review. It's my fault that I put commit()/compact() into a consumer thread, and queue.offer() into a producer thread, which called by a servlet; so "queue.offer()" may be called between "commit()" and "compact()".