Как использовать SQLite в многопоточном приложении?

, Как получить часть ДАТЫ поля DATETIME в SQL Server MS:

Один из самых быстрых и самых опрятных способов сделать это использует

DATEADD(dd, DATEDIFF( dd, 0, @DAY ), 0)

, Он избегает, чтобы слом ЦП "преобразовал дату в строку без времени и затем преобразования его назад снова" логика.

Это также не представляет внутреннюю реализацию, что "часть времени выражается как часть" даты.

Добираются, дата первого дня месяца

DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0)

Получают дату год rfom 1 назад

DATEADD(m,-12,DATEADD(dd, DATEDIFF( dd, -1, GetDate() - DAY(GetDate()) ), 0))
43
задан Edan Maor 5 November 2009 в 15:45
поделиться

3 ответа

Просмотрите эту ссылку . Самый простой способ - выполнить блокировку самостоятельно и избежать разделения соединения между потоками. Еще один хороший ресурс можно найти здесь , и он завершается следующим:

  1. Убедитесь, что вы компилируете SQLite с -DTHREADSAFE = 1.

  2. Убедитесь, что каждый поток открывает файл базы данных и сохраняет свои собственная структура sqlite.

  3. Убедитесь, что вы учитываете вероятность столкновения одного или нескольких потоков при одновременном доступе к файлу базы данных: обрабатывайте SQLITE_BUSY соответствующим образом.

  4. Убедитесь, что вы заключили в транзакции команды, которые изменяют базу данных файл, например INSERT, UPDATE, DELETE и другие.

22
ответ дан 26 November 2019 в 23:00
поделиться

Просто чтобы подчеркнуть, что вы должны быть очень осторожно использовать случайные числа в параллельной настройке. На самом деле вам следует использовать что-то вроде SPRNG

Что бы вы ни делали, убедитесь, что каждый поток не использует одинаковые случайные числа.

COMMIT или ROLLBACK снимет блокировку.
  • Ваши sqlite3_step, sqlite3_prepare и некоторые другие вызовы могут возвращать SQLITE_BUSY или SQLITE_LOCKED. SQLITE_BUSY обычно означает, что sqlite необходимо получить блокировку. Самая большая разница между двумя возвращаемыми значениями:
    • SQLITE_LOCKED: если вы получили это из инструкции sqlite3_step, вы ДОЛЖНЫ вызвать sqlite3_reset для дескриптора инструкции. Вы должны получить это только при первом вызове sqlite3_step, поэтому после вызова сброса вы можете фактически «повторить» вызов sqlite3_step. В других операциях это то же самое, что и SQLITE_BUSY
    • SQLITE_BUSY: нет необходимости вызывать sqlite3_reset, просто повторите операцию, немного подождав снятия блокировки.
  • 28
    ответ дан 26 November 2019 в 23:00
    поделиться

    Посмотрите этот код в вики SQLite .

    Я сделал нечто подобное с C и загрузил код сюда .

    Надеюсь, это полезно.

    3
    ответ дан 26 November 2019 в 23:00
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: