Проблема множественной вставки в SQLite - PullRequest
0 голосов
/ 17 февраля 2012

Я работаю с SQLite для своего приложения для Android, и после некоторых исследований я выяснил, как выполнить несколько транзакций вставки с помощью оператора UNION.

Но это довольно неэффективно. Из того, что я вижу на http://www.sqlite.org/speed.html, и на многих других форумах, я могу ускорить процесс, используя операторы BEGIN - COMMIT. Но когда я их использую, я получаю эту ошибку:

Невозможно начать транзакцию внутри транзакции.

Почему? Какой самый эффективный способ сделать несколько вставок?

1 Ответ

0 голосов
/ 17 февраля 2012

Какой драйвер JDBC вы используете? Есть только один встроенный в дистрибутив Android?

Проблема, скорее всего, связана с java.sql.Connection#setAutoCommit(). Если в соединении уже включена функция auto-commit & mdash; это можно проверить с помощью Connection#getAutoCommit() & mdash; тогда ваш драйвер JDBC уже выдает команды SQL для запуска транзакции перед вашей попыткой вручную делать, что делает вашу ручную команду излишней и недействительной.

Если вы хотите контролировать экстент транзакции, вам нужно отключить режим автоматической фиксации для Connection, вызвав

connection.setAutoCommit(false);

и затем, после того как все ваши отдельные операторы DML будут выполнены, либо подтвердите, либо откатите активную транзакцию с помощью Connection#commit() или Connection#rollback().

Я заметил, что некоторым драйверам JDBC сложно согласовать режим auto-commit с PreparedStatement методами, связанными с пакетами. В частности, драйвер Xerial JDBC и драйвер Zentus , на котором он основан, ведут борьбу с пользователем, контролирующим режим auto-commit с выполнением пакетного оператора.

...