我的目标是启用 MapDB 崩溃保护,如果发生崩溃,如何恢复数据。
我为 MapDB 启用了事务
DB db;
HTreeMap< String, String > mapDb;
db = DBMaker.fileDB( "walTest/file1.db" )
.transactionEnable()
.allocateStartSize( 64 *1024 *1024 )
.allocateIncrement( 32 *1024 *1024 )
.fileMmapEnable()
.fileMmapEnableIfSupported()
.fileMmapPreclearDisable()
.cleanerHackEnable()
.closeOnJvmShutdown()
.make();
mapDb = db.hashMap( "Test" ) //$NON-NLS-1$
.keySerializer( Serializer.STRING )
.valueSerializer( Serializer.STRING )
.createOrOpen();
for(int i=0; i<10000;i++)
{
mapDb.put(""+i, "aaaaaaaaaaa bbbbbbbbbbbbbbbbbb cccccccccccccccccccc dddddddddddddddddd");
if(i % 100 == 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(i == 5000)
{
db.commit();
}
}
我看到它创建了 2 个文件,file1.db 和 file1.db.wal.0
现在,我重新启动服务器并使用以下代码读取 MapDB
System.out.println(mapDb.size());
输出为 5001 其他未提交的 5000 未恢复。
我在做 mapDb.size() 之前尝试使用 db.commit ,但它仍然没有帮助。
那么,wal 文件是如何防止服务器或 jvm 崩溃的呢?我们如何恢复wal文件?