Многопоточность в Sqlite

#c# #multithreading #sqlite

#c# #многопоточность #sqlite

Вопрос:

Я использую System.data.sqlite для подключения к базе данных Sqlite, согласно документации Sqlite, пользователи могут включить многопоточность, используя флаг SQLITE_OPEN_NOMUTEX как часть строки подключения. Но я не смог найти ни одного ключа в строке подключения, который принимает флаг. Включено ли оно по умолчанию? если нет, то как я могу это сделать?

Комментарии:

1. sqlite.phxsoftware.com/forums/t/56.aspx

2. Другими словами, многопоточное использование, похоже, используется по умолчанию.

3. по умолчанию используется многопоточность, но не многопоточный режим. по умолчанию используется serialized, что, конечно, позволяет безопасно использовать многопоточность (сериализация вызовов)

4. Мой код на C # является потокобезопасным, или я обеспечиваю потокобезопасность из своего кода на C #, но я хочу использовать многопоточный режим SQLite во время выполнения, используя строку подключения. Как я могу это сделать?

5. Похоже, вы не можете это контролировать — посмотрите на общедоступные свойства SqlLiteConnectionBuilder — ни один из них не разрешает режим многопоточности. Я не вижу ничего, что предполагало бы, что вы получаете больше, чем режим сериализации по умолчанию, который допускает многопоточное использование , но не многопоточный режим. Может быть, это неправильно, но я не вижу ничего общедоступного…

Ответ №1:

Режим многопоточности определяется временем компиляции, параметрами запуска или среды выполнения. Подробнее здесь:

http://www.sqlite.org/threadsafe.html

В документах говорится, что по умолчанию используется serialized, что означает, что вы можете использовать несколько потоков — это защитит вас. Если вы хотите больше параллелизма, вы можете использовать многопоточный режим.

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

Сам API намекает на это, принимая объект db (соединение) в качестве аргумента для многих функций, которые вы вызываете последовательно. Например, посмотрите на эти функции, которые вы вызываете, чтобы получить ошибку:

 int sqlite3_errcode(sqlite3 *db); 
const char *sqlite3_errmsg(sqlite3*);
  

Комментарии:

1. Я хочу сделать его многопоточным во время выполнения. как я могу указать это в .Net provider?

2. Мое единственное сомнение в том, что это сообщение 2005 года. Возможно, вы захотите взглянуть на исходный код и посмотреть, что он делает. Если по умолчанию он многопоточный, вам необходимо создать несколько объектов подключения и убедиться, что каждый из объектов подключения сериализован.

3. @Anuraj: Я только что проверил исходный код. Кажется, что режим потоковой передачи никогда не указывается явно, и нет способа настроить его во время выполнения через управляемые оболочки. По умолчанию по-прежнему установлено значение serialized .