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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: База данных (QSqlDatabase) по умолчанию?  (Прочитано 14661 раз)
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #15 : Февраль 28, 2015, 21:07 »

Подозреваю, что это из-за того как Windows работает с файлами.
Такой подход как я описал, видимо, возможен только или из одного приложения в несколько потоков, или из разных приложений но только под *nix системами.

Да. Таймаут - это отлично, но сначала необходимо базу открыть, а она, зараза, не открывается.
В старых версиях Windows (3.0, 3.1) была команда share.exe, которая позволяла использовать файл параллельно. Но это было 25 лет назад, с тех пор многое изменилось. С другой стороны, в Windows я могу открыть текстовый файл на редактирование несколькими редакторами одновременно. Но не факт, что они держат его открытым. Скорее всего, качают содержимое, и потом пытаются сохранять в заранее известное место.
Записан

Эвтаназия - наше хобби!
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #16 : Март 01, 2015, 01:16 »

Сделал тестовый проект с двумя подпроектами:
writer - создает бд и пишет данные;
reader - читает из этой бд данные и выводит на экран.

Все работает, проверено на Widnows 7, Qt 5.3.1.

Запускать writer, спустя несколько секунд reader.
« Последнее редактирование: Март 01, 2015, 01:21 от Johnik » Записан
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #17 : Март 01, 2015, 12:45 »

Получается, что работает таки.
В чем тогда проблема?

PinkPanther: покажите больше кода, может так будет понятна проблема.
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #18 : Март 01, 2015, 17:11 »

Johnik, если я правильно понял исходники, whiter запускается, открывает (создает) базу и тестовую таблицу, через 3 секунды пишет в таблицу и отключается. reader открывает базу и читает через 3 секунды работы. Так? Если я запущу reader с интервалом несколько секунд (3+), writer уже умрет, и база будет свободна. Если бы writer писал, потом доживал с открытой базой еще секунд 30, а ридер бы начинал читать через 3 секунды, было бы интересно протестить. Я попробую запустить код со своими задержками, но попозже. Спасибо!

Termit, больше кода, наверное, не нужно. Ошибка вылетает на этапе исполнения того участка, который выложил. Первое запущенное приложение открывает базу без приключений, а следующие спотыкаются и пишут "не могу открыть базу". В других местах db упоминается только в слотах, при создании временных экземпляров QSqlQuery. Я погуглил, гугл говорит, что лок SQLite при попытке доступа из разных приложений - обычная практика. Идеология SQLite - уютненькая базочка для одного приложения. Работать с ней как с сервером БД, видимо, архибессмысленно (при чтении/записи 2,000 записей ждать приходится секунд 10, при этом база живет на SSD-диске).
Записан

Эвтаназия - наше хобби!
Termit
Самовар
**
Offline Offline

Сообщений: 144



Просмотр профиля WWW
« Ответ #19 : Март 01, 2015, 20:26 »

У writer-а нет вызова db.close(). База остается открытой.

А больше кода тут уж смотрите сами Улыбающийся

Что касается области применения sqlite, то да, явно у нее не серверное исполнение. Но никто не заявлял, что она не может работать с несколькими приложениями однозначно.

По делу: порылся в настройках базы, помимо прочего там есть такое понятие как locking_mode - http://sqlite.org/pragma.html#pragma_locking_mode. Может именно это мешает жить?
Записан

Человеческая глупость дает представление о бесконечности
(с) Иоанна Хмелевская
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #20 : Март 01, 2015, 22:23 »

whiter запускается, открывает (создает) базу и тестовую таблицу, через 3 секунды пишет в таблицу и отключается.
writer, создает базу и запускает таймер, который через каждые 3 секунды добавляет новую запись в таблице, отключения я не предусматривал. закрыть программу можно только по клавише Ctrl+C

reader, так же каждые три секунды читает последнюю запись из той же таблицы, куда пишет writer, и тоже отключения не предусматривал.
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #21 : Март 02, 2015, 03:34 »

Да, действительно... в обоих примерах база открывается в main() и не закрывается. То есть, при нулевой активности, к базе SQLite можно относительно свободно подключаться (что нормально). Значит, дело в активности первого запущенного приложения.

В ридере-райтере объект QSqlQuery создается в функции, живет в стэке и удаляется при завершении функции, то есть сразу же после чтения или записи. Вероятность, что ридер и райтер пересекутся, минимальна. Гугл говорит, что одна из причин лока - активные query, которые меняли базу, а также активные query, которые использовали курсоры (query.next()). Надо будет провести эксперимент и объявить query не в слоте, а в классе, привязав к базе в конструкторе. Если у ридера возникнут проблемы, значит, дело в этом.
Записан

Эвтаназия - наше хобби!
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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