Russian Qt Forum
Сентябрь 30, 2024, 20:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: возможно ли несколько подключений к базе в памяти?  (Прочитано 11080 раз)
ilyagoo
Гость
« : Ноябрь 24, 2010, 16:26 »

в доках написано, что соединение с БД может использоваться только из нити, в которой оно создано.
можно ли при работе с БД в памяти создать два соединения в разных нитях? как?
спасибо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноябрь 24, 2010, 16:44 »

Можешь клонировать подключение.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
« Ответ #2 : Ноябрь 24, 2010, 16:54 »

в одной нити создал подключение, создал таблицу.
в другой клонировал подключение и запросил таблицы. там их нет. создалась копия базы?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Ноябрь 24, 2010, 16:59 »

1. Ты можешь во всех потоках использовать одно подключение (QSqlDatabase QSqlDatabase::database ( const QString & connectionName = QLatin1String( defaultConnection ), bool open = true ) [static]).
2. При клонировании задал новое имя? Покажи код.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
« Ответ #4 : Ноябрь 24, 2010, 17:08 »

1) возвращенное соединение можно считать созданным в этой нити.
2) gui-нить:
Код:
    m_Database = QSqlDatabase::addDatabase( "QSQLITE", "db_gui" );
    m_Database.setDatabaseName( ":memory:" );
    m_Database.open();

    QSqlQuery query( m_Database );

    bool ret = query.exec( "create table test ( "SomeField int" ) );

фоновая нить
Код:
        m_Database = QSqlDatabase::cloneDatabase( QSqlDatabase::database( "db_gui" ), "db_background" );
        m_Database.open();

        QStringList t = m_Database.tables(); // здесь пусто
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Ноябрь 24, 2010, 17:20 »

В фоновой нити используй
Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::database( "db_gui" );
QStringList t = db.tables();
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
« Ответ #6 : Ноябрь 24, 2010, 17:28 »

а это позволит использовать соединение безопасно без критических секций?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Ноябрь 24, 2010, 17:34 »

Что значит безопасно?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
« Ответ #8 : Ноябрь 24, 2010, 17:36 »

в одной нити писать, в другой - читать
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #9 : Ноябрь 24, 2010, 17:50 »

SQLite сама по себе однопользовательская... Попробуй. Улыбающийся
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
« Ответ #10 : Ноябрь 24, 2010, 17:53 »

что есть однопользовательская в данном контексте? соединение же объект Qt, он же должен это как-то контролировать...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Ноябрь 24, 2010, 18:01 »

SQLite не поддерживает больше одного соединения на файл, на сколько я помню. Т.е. поддерживает, но не совсем.
Я лично юзал с одним подключением - все работало.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ilyagoo
Гость
« Ответ #12 : Ноябрь 24, 2010, 18:06 »

а другие БД, например, постгрес можно создать в памяти?
Записан
BRE
Гость
« Ответ #13 : Ноябрь 24, 2010, 18:15 »

Информация по SQLite: http://www.sqlite.org/threadsafe.html
Записан
Kolobok
Гость
« Ответ #14 : Ноябрь 24, 2010, 18:28 »

Цитировать
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.

Я тоже думал, почему они пишут, что нельзя, если работает. Даже здесь народ спрашивал. Пока в одном проекте не пришлось с большими обьемами данных работать. Один поток писал в базу, другой читал, и все это довольно интенсивно. И тут данные стали пропадать. Немного, но клиенту почему-то не нравилось. cloneDatabase() это дело исправил.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.168 секунд. Запросов: 22.