Ответ 1
Я не совсем уверен в Java-эквивалентах, но:
-
Логическая синхронизация означает, что любые изменения БД записываются из кэша СУБД в файловую систему. В C вы сделали бы это, используя fprintf/fwrite/write/etc.
-
Физическая синхронизация означает вышеупомянутое, с добавленной операцией просить ОС нажимать указанные изменения на постоянное хранилище (жесткий диск, SSD, независимо), а не хранить их в кеше файловой системы. Это гарантирует, что эти изменения не будут потеряны, если что-нибудь случится. В системе Linux/POSIX, которая подразумевает вызов системных вызовов fsync() или fdatasync().
EDIT:
По-видимому, эквивалент fsync() в Java - FileDescriptor.sync():
http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html#
Дело в том, что для достижения истинной семантики ACID для БД все транзакции должны быть синхронизированы с постоянным носителем. В противном случае ваше приложение должно было бы иметь дело с транзакциями, которые не выполнялись без ошибок - СУБД будет переводить транзакции в файловую систему и успешно возвращаться, но тогда изменения могут потеряться, если, например, система потеряла мощность.
Проблема с физической синхронизацией заключается в том, что она может существенно повлиять на производительность. Жесткие диски могут обрабатывать ограниченное количество транзакций в секунду (SSD намного быстрее при этом), поэтому первое, что нужно сделать для повышения производительности БД, - это объединить вставки в больших транзакциях.