Как надежно сериализовать данные - PullRequest
2 голосов
/ 09 ноября 2009

Добрый день, я получаю данные из канала связи и отображаю их. Параллельно я сериализую его в базу данных SQLite (используя обычные операторы SQL INSERT). После выхода из приложения я выполняю .commit для объекта sqlite.

Что произойдет, если мое приложение будет жестоко завершено в середине? Будут ли последние (разумно - не скажем, 100 мкс назад, но хотя бы секунду назад) данные безопасно храниться в базе данных даже без создания .commit? Или я должен иметь периодическую фиксацию? Каковы лучшие модели для этих вещей?


Я попытался включить автокоммит (опция sqlite), и это сильно замедляет код в ~ 55 раз (автокоммит против одного коммита в конце). Выполнение фиксации через каждые 100 вставок обеспечивает производительность в пределах 20% от оптимального режима. Так что автокоммит очень медленный для меня.

Мое приложение закачивает много данных в БД - что я могу сделать, чтобы оно работало хорошо?

Ответы [ 3 ]

3 голосов
/ 09 ноября 2009

Вы должны выполнить это в транзакции и, следовательно, выполнить commit в соответствующих точках процесса. Транзакция гарантирует, что эта операция атомная , то есть она работает или не работает.

Атомность утверждает, что база данных изменения должны следовать «все или ничто »правило. Каждая транзакция называется «атомным», если одна часть транзакции не удается, весь транзакция не удалась Очень важно, чтобы система управления базами данных поддерживать атомную природу транзакции несмотря на любую СУБД, сбой операционной системы или оборудования.

Если вы не зафиксировали, вставки не будут видны (и будут отменены), когда ваш процесс будет завершен.

Когда вы выполняете эти коммиты? Когда ваши вставки представляют что-то непротиворечивое и полное . например, если вам нужно вставить 2 фрагмента информации для каждого сообщения, сделайте коммит после того, как вы вставили оба фрагмента информации. Не передавайте после каждого, так как ваша информация не будет последовательной или полной.

2 голосов
/ 09 ноября 2009

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

1 голос
/ 09 ноября 2009

Вы должны выполнять COMMIT каждый раз, когда выполняете логическое изменение.

Одна из причин транзакции состоит в том, чтобы запретить отображение незафиксированных данных транзакции извне. Это важно, потому что иногда одно логическое изменение может переводиться в несколько операторов INSERT или UPDATE. Если один из последних запросов транзакции завершится неудачно, транзакция может быть отменена с помощью ROLLBACK, и никакие изменения не регистрируются.

Вообще говоря, никакие изменения, выполненные в транзакции, не регистрируются в базе данных до тех пор, пока не завершится COMMIT.

не сильно ли это замедляет мой код? - захарпопов

Частые коммиты, может замедлить ваш код, и в качестве оптимизации вы можете попробовать сгруппировать несколько логических изменений в одну транзакцию. Но это отклонение от правильного использования транзакций, и вы должны делать это только после измерения, что это значительно повышает производительность.

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