0

在京都内阁数据库中是否可以安全地制作数据库快照并同时写入数据库?

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来自不同进程的实用程序。我发现这些操作会阻塞其他编写器进程-es ( kcpolymgr set),直到操作完成。

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

4

1 回答 1

0

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

为了在同一过程中进行测试,我通过 JMX 公开了京都内阁方法,并尝试从数据库中获取任何值,同时正在进行快照或副本setget

方法setget正在等待并发快照或复制完成。


我找到了涵盖该问题的文档的一部分。它管理缓存哈希数据库,但看起来其他数据库实现的行为类似:

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

db.dump_snapshot("backup.kcss"); 
db.load_snapshot("backup.kcss");
于 2013-11-15T12:15:16.540 回答