什么是京都内阁数据库的"物理同步"?

Fel*_*ipe 11 java tokyo-cabinet kyotocabinet

函数begin_transaction接受一个布尔参数,指示应该进行什么类型的同步; 物理时为真或逻辑时为假.

当它指的是"物理"或硬同步时,它意味着什么?

thk*_*ala 8

我不完全确定Java等价物,但是:

  • 逻辑同步意味着任何数据库更改都会从DBMS缓存写入文件系统.在C中你可以使用fprintf/fwrite/write/etc来做到这一点.

  • 物理同步意味着上述操作,增加了操作,要求操作系统将所述更改推送到永久存储(硬盘驱动器,SSD,无论如何),而不是将它们保留在文件系统缓存中.这确保了如果发生任何不幸事件,那些变化不会丢失.在Linux/POSIX系统上,这意味着调用fsync()或fdatasync()系统调用.

编辑:

显然,Java中fsync()的等价物是FileDescriptor.sync():

http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html#

关键是要实现DB的真正ACID语义,所有事务都应该同步到永久存储介质.否则,您的应用程序必须能够处理无提示失败的事务 - DBMS会将事务推送到文件系统并成功返回,但如果系统断电,则更改可能会丢失.

物理同步的问题在于它会对性能产生重大影响.硬盘驱动器每秒可以处理有限数量的事务(SSD 在这方面快得多),这就是为什么提高数据库性能的第一件事就是在更大的事务中捆绑插入.