2016-07-28 2 views
1

У меня многопоточное приложение Qt, которое имеет несколько потоков, обращающихся к одной базе данных. Мне нужно создать отдельные соединения QSqlDatabase для выполнения SELECT/INSERT/UPDATE в каждом потоке?Использование одного соединения QSqlDatabase в нескольких потоках qt

Из Qt документации, я не могу понять, если следующая директива обескураживает выше подход я предложил:.

«Соединение может использоваться только внутри потока, создавшего его Перемещение соединений между потоки или создание запросов из потока не поддерживается ».

Я практически попытался использовать одно и то же соединение в нескольких своих QThreads, и все работает нормально, но хотелось понять, правильно ли это делать.

FYI, я использую sqlite3 внутри Qt (с использованием QtSql API), который я понимаю, поддерживает сериализованный режим по умолчанию: https://www.sqlite.org/threadsafe.html

Причины я хочу использовать то же имя соединения в нескольких потоках потому что, когда я пытался использовать разные подключения к одной базе данных по нескольким потокам и выполнял SELECT/INSERT/UPDATE, я часто получал database locked. Однако при использовании одного и того же соединения в нескольких потоках эта проблема полностью устранена.

Просьба направлять на то же самое.

С уважением,

Саурабх Ганди

+0

Возможно, создайте класс обертки, в котором есть несколько слотов для вставки/обновления/удаления и иметь его в своем потоке – Zaiborg

ответ

2

документация не только препятствуя, он категорически заявляет, что вы не должны делать это (курсив мой):

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

Таким образом, нет, вы не можете использовать одно соединение из нескольких потоков. Это может случиться, но это не гарантирует работу, и вы вызываете то, что составляет неопределенное поведение. Имейте в виду, что это не обязательно.

Вам нужно либо:

  1. сериализовать доступ к базе данных на вашем конце, или

  2. Изменить параметры подключения, так что замки не отклонить запрос, но блок до базы данных становится доступным. Я не совсем уверен, что проблема «database locked»: вы никогда не должны видеть этот код ошибки (я полагаю, это SQLITE_LOCKED), если вы действительно используете несколько соединений. Sqlite 3 может быть легко использован из нескольких потоков, он не должен требовать каких-либо усилий на вашем конце, кроме включения многопоточности и использования отдельных подключений.