2010-11-29 13 views

Respuesta

8

No estoy exactamente seguro acerca de los equivalentes de Java, pero:

  • sincronización lógico significa que cualquier cambio de base de datos se escriben desde la caché DBMS para el sistema de ficheros. En C lo harías usando fprintf/fwrite/write/etc.

  • Sincronización física significa lo anterior, con la operación adicional de pedir al SO que introduzca dichos cambios en el almacenamiento permanente (disco duro, SSD, lo que sea) en lugar de guardarlos en el caché del sistema de archivos. Eso asegura que esos cambios no se perderán si sucede algo impropio. En un sistema Linux/POSIX que implicaría llamar a las llamadas al sistema fsync() o fdatasync().

EDIT:

Aparentemente el equivalente de fsync() en Java es FileDescriptor.sync():

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

El punto es que para lograr una verdadera semántica ácido durante un DB , todas las transacciones deben estar sincronizadas con el medio de almacenamiento permanente. De lo contrario, su aplicación debería ser capaz de tratar con transacciones que fallaron silenciosamente: el DBMS empujaría las transacciones al sistema de archivos y regresaría con éxito, pero luego los cambios podrían perderse si, p. el sistema perdió potencia.

El problema con la sincronización física es que puede tener un impacto significativo en el rendimiento. Los discos duros pueden manejar un número limitado de transacciones por segundo (los SSD son un lote más rápido en esto), por lo que lo primero que se debe hacer para mejorar el rendimiento del DB es agrupar inserciones en transacciones más grandes.

+1

¿Alguien podría agregar la etiqueta "kyotocabinet" para esta pregunta, por favor? No tengo 1.500 para crear nuevas etiquetas. ¡Gracias! –

Cuestiones relacionadas