Russian Qt Forum

Qt => Базы данных => Тема начата: ilyagoo от Ноябрь 24, 2010, 16:26



Название: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 24, 2010, 16:26
в доках написано, что соединение с БД может использоваться только из нити, в которой оно создано.
можно ли при работе с БД в памяти создать два соединения в разных нитях? как?
спасибо.


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: Пантер от Ноябрь 24, 2010, 16:44
Можешь клонировать подключение.


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 24, 2010, 16:54
в одной нити создал подключение, создал таблицу.
в другой клонировал подключение и запросил таблицы. там их нет. создалась копия базы?


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


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 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(); // здесь пусто


Название: Re: возможно ли несколько подключений к базе
Отправлено: Пантер от Ноябрь 24, 2010, 17:20
В фоновой нити используй
Код
C++ (Qt)
QSqlDatabase db = QSqlDatabase::database( "db_gui" );
QStringList t = db.tables();
 


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 24, 2010, 17:28
а это позволит использовать соединение безопасно без критических секций?


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: Пантер от Ноябрь 24, 2010, 17:34
Что значит безопасно?


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 24, 2010, 17:36
в одной нити писать, в другой - читать


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: Пантер от Ноябрь 24, 2010, 17:50
SQLite сама по себе однопользовательская... Попробуй. :)


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 24, 2010, 17:53
что есть однопользовательская в данном контексте? соединение же объект Qt, он же должен это как-то контролировать...


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: Пантер от Ноябрь 24, 2010, 18:01
SQLite не поддерживает больше одного соединения на файл, на сколько я помню. Т.е. поддерживает, но не совсем.
Я лично юзал с одним подключением - все работало.


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 24, 2010, 18:06
а другие БД, например, постгрес можно создать в памяти?


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: BRE от Ноябрь 24, 2010, 18:15
Информация по SQLite: http://www.sqlite.org/threadsafe.html


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: Kolobok от Ноябрь 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() это дело исправил.


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 25, 2010, 09:13
cloneDatabase() это дело исправил.

вроде cloneDatabase() создает клон соединения, почему тогда в коде выше база пустая?


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: Пантер от Ноябрь 25, 2010, 09:54
После клонирования open выдает какие-нибудь ошибки?


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 25, 2010, 10:04
нэт. открытие происходит успешно. но таблиц в базе нет.


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: Пантер от Ноябрь 25, 2010, 10:27
Интересно. Сейчас проверил: если создавать базу в памяти, то клонирование не канает. Если :memory: заменить на имя файла, то все отлично работает. Возможно, ограничение базы в памяти?


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 25, 2010, 10:38
похоже на то((
а как заметил Kolobok, юзать одно соединение некорректно


Название: Re: возможно ли несколько подключений к базе в памяти?
Отправлено: ilyagoo от Ноябрь 25, 2010, 11:15
нашел ветку без кода, но товарищ говорит о том, что решил проблему. вот только как...

http://www.qtcentre.org/threads/28780-QSqlite-multiple-connections-to-in-memory-database
 (http://www.qtcentre.org/threads/28780-QSqlite-multiple-connections-to-in-memory-database)