Разъяснение пакета Java / SQLite и автоматической фиксации - PullRequest
5 голосов
/ 18 марта 2012

Я скопировал следующий пример с веб-сайта библиотеки SQLite Java:

PreparedStatement prep =
         conn.prepareStatement("insert into people values (?, ?);");
prep.setString(1, "Gandhi");
prep.setString(2, "politics");
prep.addBatch();
prep.setString(1, "Turing");
prep.setString(2, "computers");
prep.addBatch();
conn.setAutoCommit(false);
prep.executeBatch();
conn.setAutoCommit(true);

Я пытаюсь понять важность переключения autoCommit() по обе стороны от executeBatch().Это просто предотвращает фиксацию для каждой отдельной пакетной операции?Таким образом, один «массовый» коммит будет сделан setAutoCommit(true).

Ответы [ 2 ]

10 голосов
/ 18 марта 2012

Автоматическая фиксация отключена перед выполнением пакета, потому что активация автоматической фиксации выполнит фиксацию (т. Е. Дождаться, пока произойдет синхронизация, что означает, что она будет ожидать фактической записи данных в постоянное хранилище, например на жесткий диск) после каждой вставленной строки.

Если автоматическая фиксация равна false, синхронизация не будет выполняться.

Разница в ожидании синхронизации и отсутствии ожидания заключается в том, что данные находятся на жестком диске или в буфере (это может быть буферизованный ввод-вывод или буфер жесткого диска).

Короче говоря, отключение автоматической фиксации дает вам повышение производительности. И я думаю, что по умолчанию автоматическая фиксация включена.

Другой способ оптимизации

Если вы хотите включить автоматическую фиксацию и все еще нуждаться в повышении производительности, просто попробуйте запустить как транзакцию до пакетной операции и зафиксировать транзакцию после. Таким образом, sqlite не будет автоматически фиксироваться после каждой вставки и даст хороший прирост производительности.

EDIT:

При запуске транзакции вы отключаете только автоматическую фиксацию. для этой транзакции, и он будет снова включен после завершения транзакции. Что помогает авто коммит когда вы вставляете / обновляете строки отдельно (не в пакетном режиме), вам не нужно начинать транзакция явно для каждой вставки / обновления. И относительно установки автоматической фиксации в true, после На самом деле, не требует призыва. Если вы делаете авто-фиксацию истина и все, что вы уже вставили / обновили, не будет иметь никакого эффекта и не будет иметь того же самого гарантирует автоматическую фиксацию true перед выполнением вставки / обновления.

Вот некоторая информация по ускорению Sqlite INSERT.

4 голосов
/ 09 июня 2012

В ответах и ​​комментариях содержится некоторая неверная информация, поэтому я решил добавить ответ.

  1. К вашему сведению, SQLite не поддерживает автоматическую фиксацию напрямую,Вызов setAutoCommit(false) для соединения SQLite JDBC фактически запускает транзакцию с драйверами Xerial и Zentus.См. Этот вопрос: Как отключить автокоммит в sqlite4java?

  2. Я почти уверен, что установка автоматического подтверждения обратно в значение true не сделать коммит на соединение с базой данных.Следующий оператор, который завершается, сохранит все ожидающие изменения, но вы должны сделать conn.commit();, чтобы фактически зафиксировать пакетные операции.

  3. Запуск транзакции в основном такой же, как отключение автоматическогокоммит, поэтому неправильно подразумевать, что вы можете оставить авто-фиксацию включенной во время транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...