crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как правильно открыть коннекты к БД, из разных потоков
mezmay
  опции профиля:
сообщение 29.11.2012, 8:55
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Работа с одной базой данных будет происходить из разных потоков. В документации сказано, что в этом случае надо для каждого потока создавать(или открывать?) соединение с БД. Как это правильно сделать? Для одного потока соединение создается так:
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() передавать еще и новое имя коннекта?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 7)
Алексей1153
  опции профиля:
сообщение 29.11.2012, 9:01
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


вроде не нужно для каждого потока. Насколько я понимаю, список открытых баз - синглтон. И будет доступен по всему процессу. Даже синхронизацию делать, наверное, не требуется - так как это будет делать СУБД
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 29.11.2012, 9:04
Сообщение #3


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


А как же:
Цитата
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
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


ну тогда да, получается, нужно в каждом потоке открыть БД.

Попробовать то несложно - если не откроешь в потоке, то запросы оттуда работать не будут в этом случае
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 29.11.2012, 9:41
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


я что то недопонял, а зачем вообще в 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
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(mezmay @ 29.11.2012, 10:55) *
Это значит, что для каждого потока надо в addDatabase() передавать еще и новое имя коннекта?
посмотри внимательно входные аргументы этого метода, там ответ на твой вопрос.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 29.11.2012, 13:21
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Цитата
посмотри внимательно входные аргументы этого метода, там ответ на твой вопрос

посмотрел:
QSqlDatabase    addDatabase ( const QString & type, const QString & connectionName = QLatin1String( defaultConnection ) )


что такое QLatin1String( defaultConnection ) я не совсем понял, но наверное надо вместо этого передавать уникальное имя для каждого потока?

Сообщение отредактировал mezmay - 29.11.2012, 13:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.11.2012, 13:54
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(mezmay @ 29.11.2012, 15:21) *
что такое QLatin1String( defaultConnection ) я не совсем понял
это предопределённое имя - константа. Позволяющее упростить работу с модулем QSQL при использовании одного единственного соединения. Т.к. имя соединения используется во многих места - QSqlQuery, QSqlQueryTableModel, ...


Цитата(mezmay @ 29.11.2012, 15:21) *
вместо этого передавать уникальное имя для каждого потока?
да.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


6 чел. читают эту тему (гостей: 6, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 15:48