KyotoCabinet数据库的快照与写入并发

时间:2013-11-14 10:35:21

标签: database multithreading kyotocabinet

在Kyoto Cabinet数据库中是否可以安全地制作数据库快照并同时写入数据库?

KyotoCabinet数据库类kyotocabinet.DB(适用于其他语言的JAVA) 提供以下方法:

 boolean    dump_snapshot(String dest) // Dump records into a snapshot file.
 boolean    copy(String dest) // Create a copy of the database file. 

这两项行动都可能很长。我没有直接测试这种方法,而是使用来自不同进程的kcpolymgr实用程序。我发现操作会阻止其他写入进程(kcpolymgr set),直到操作完成。

当写入来自同一进程中的其他线程时,行为是否相同?

1 个答案:

答案 0 :(得分:0)

数据库的快照或副本阻止来自其他线程和进程的并发数据库操作。

为了在同一过程中进行测试,我通过JMX公开了Kyoto Cabinet方法,并尝试setget数据库中的任何值,同时快照或副本正在进行中。

方法setget等待并发快照或副本完成。


我找到了documentation的一部分来解决这个问题。它调整了缓存哈希数据库,但看起来其他数据库实现的行为类似:

  

主要用于缓存哈希数据库和缓存树数据库   提供了“伪快照”机制。 BasicDB::dump_snapshot' dumps all records into a stream or a file. The BasicDB :: load_snapshot'方法从流或文件加载记录。   尽管操作是以原子方式执行的,但它们并未完成   暂时但是需要花时间与数据库大小成比例   阻止其他线程。因为伪快照数据的格式   在所有数据库类中很常见,它对迁移很有用   彼此的记录。

db.dump_snapshot("backup.kcss"); 
db.load_snapshot("backup.kcss");