Автор: mezmay 29.11.2012, 8:55
Работа с одной базой данных будет происходить из разных потоков. В документации сказано, что в этом случае надо для каждого потока создавать(или открывать?) соединение с БД. Как это правильно сделать? Для одного потока соединение создается так:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("XXX");
db.setUserName("Admin");
db.setHostName("localhost");
db.setPassword("Admin");
db.open();
я должен этот код вызвать для каждого потока, или какой-то другой? Там еще сказано:
Цитата
Adds a database to the list of database connections using the driver type and the connection name connectionName. If there already exists a database connection called connectionName, that connection is removed.
Это значит, что для каждого потока надо в addDatabase() передавать еще и новое имя коннекта?
Автор: Алексей1153 29.11.2012, 9:01
вроде не нужно для каждого потока. Насколько я понимаю, список открытых баз - синглтон. И будет доступен по всему процессу. Даже синхронизацию делать, наверное, не требуется - так как это будет делать СУБД
Автор: mezmay 29.11.2012, 9:04
А как же:
Цитата
Threads and the SQL Module
A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.
In addition, the third party libraries used by the QSqlDrivers can impose further restrictions on using the SQL Module in a multithreaded program. Consult the manual of your database client for more information
Автор: Алексей1153 29.11.2012, 9:06
ну тогда да, получается, нужно в каждом потоке открыть БД.
Попробовать то несложно - если не откроешь в потоке, то запросы оттуда работать не будут в этом случае
Автор: maint 29.11.2012, 9:41
я что то недопонял, а зачем вообще в sqlite юзер и пароль ?
Для отдельных dll/so я поступаю достаточно просто
if(QSqlDatabase::contains(QSqlDatabase::defaultConnection)) {
db = QSqlDatabase::database();
} else {
db = QSqlDatabase::addDatabase("QSQLITE");
}
db.setDatabaseName(dbname);
db.open();
Иначе про default connection что то говорит на консоль
Автор: Litkevich Yuriy 29.11.2012, 9:42
Цитата(mezmay @ 29.11.2012, 10:55)
Это значит, что для каждого потока надо в addDatabase() передавать еще и новое имя коннекта?
посмотри внимательно входные аргументы этого метода, там ответ на твой вопрос.
Автор: mezmay 29.11.2012, 13:21
Цитата
посмотри внимательно входные аргументы этого метода, там ответ на твой вопрос
посмотрел:
QSqlDatabase addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )
что такое
QLatin1String( defaultConnection ) я не совсем понял, но наверное надо вместо этого передавать уникальное имя для каждого потока?
Автор: Litkevich Yuriy 29.11.2012, 13:54
Цитата(mezmay @ 29.11.2012, 15:21)
что такое QLatin1String( defaultConnection ) я не совсем понял
это предопределённое имя - константа. Позволяющее упростить работу с модулем QSQL при использовании одного единственного соединения. Т.к. имя соединения используется во многих места - QSqlQuery, QSqlQueryTableModel, ...
Цитата(mezmay @ 29.11.2012, 15:21)
вместо этого передавать уникальное имя для каждого потока?
да.