SQL запрос в SQLite - страница 11

 

Причем скорость работы все системы будет зависеть и от настроек выбора потоков и таблиц,

чем меньше потоков и таблиц, тем быстрее работа

Параметры, влияющие на скорость работы

 

 

На тестовом контуре, сейчас, доступно 105 фьючерсов

При полной загрузке (все 105 фьючерсов), все отлично работает


И в каждом дочернем окне есть информация об инструменте + обрабатывается Tick (таблица common), и если

есть поток стаканов, то окно получает свой стакан. Остальные данные берутся из базы по запросу

 
prostotrader #:

Спасибо!

Работает,  но появилась другая проблема, ордера sell (dir = 2) и ордера buy (dir=1) расположены

в разнобой, тогда как в стакане сначала (сверху) должны располагаться ордера sell (dir = 2) от более

большой цены к маленькой


Такой запрос

Не помогает

В сортировку надо добавить эти поля , dir
...Order by price, dir ...


 
JRandomTrader #:

Нет ли смысла ордера на покупку и на продажу получать двумя разными запросами?

Нет , не стоит так делать 
Лучше просто отсортировать.

 
prostotrader #:

2 запроса - двойное "отжирание" времени, но я решил проблему

переставив местами сортировку, теперь стакан правильный


Но нужно еще проверить, как будет с отрицательными ценами...
А , вижу , все верно именно так.

 
Yuriy Zaytsev #:
А , вижу , все верно именно так.

Спасибо за помощь.

 

Привет!

В описании SQLite написано:

9. Иногда запросы возвращают SQLITE_BUSY в режиме WAL
Второе преимущество WAL-режима заключается в том, что Писатели не блокируют читателей, а читатели не блокируют писателей. В основном это так. Но есть некоторые неясные случаи,
когда запрос к WAL-режиму база данных может возвращать SQLITE_BUSY, поэтому приложения должны быть подготовлены за эту случайность.
К случаям, когда запрос к базе данных в режиме WAL может возвращать SQLITE_BUSY, относятся следующие:
Если для другого подключения к базе данных открыт режим базы данных в режиме монопольной блокировки, то все запросы к database вернет SQLITE_BUSY.
И Chrome, и Firefox открывают свои файлы базы данных в режиме монопольной блокировки, поэтому попытки прочитать Chrome или Базы данных Firefox
во время работы приложений столкнутся с этим проблема, например.
Когда последнее соединение с определенной базой данных закрывается, это соединение приобретет эксклюзивную блокировку на короткое время,
пока оно очищает файлы WAL и разделяемой памяти. Если вторая база данных пытается для открытия и запроса базы данных при первом подключении
все еще находится посередине В процессе очистки второе соединение может получить ошибку SQLITE_BUSY.
Если последнее подключение к базе данных завершилось сбоем, то первый новый Подключение для открытия базы данных запустит процесс восстановления.
В Во время восстановления удерживается эксклюзивная блокировка. Таким образом, если третье соединение с базой данных пытается подключиться и выполнить запрос,
пока второе соединение выполняет восстановление, Третье подключение получит ошибку SQLITE_BUSY.

А есть ли такой режим работы SQLite, в котором никогда не конфликтуют множественные соединения с базой?

Возможно ли установить очередь запросов разных соединений?

К сожалению (у меня включен режим WAL), при работе с базой возникает ошибка "Database is locked".


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

 
prostotrader #:

Привет!

В описании SQLite написано:

А есть ли такой режим работы SQLite, в котором никогда не конфликтуют множественные соединения с базой?

Возможно ли установить очередь запросов разных соединений?

К сожалению (у меня включен режим WAL), при работе с базой возникает ошибка "Database is locked".

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

собственно "давно обещанное большевиками случилось" :-(

а именно файловые блокировки

Режима когда их нет - НЕТ.

Возможны некоторые обходные пути, которые могут временно помочь (именно временно, потом всё равно те-же грабли):

* перенесите базу в RAM-диск

* у вас множество хендлов к базе - разделите кому не надо писать пусть будет read-only

* отключите auto-commit, оберните все запросы в TRANSACTION, а COMMIT/ROLLBACK вызывайте самостоятельно и обрабатывайте ошибки (повторы, переподключения, etc)

* как самый крайний случай добавьте RW-Mutex ко всем запросам. Это убьёт скорость напрочь (всё равно что однопоточно), но зато блокировки будут на уровень выше и не вызовут краха.

а вообще надо смотреть на другие базы пока не поздно.

из встраиваемых в приложения (не требующих отдельного сервера) и более менее близких с SQLite есть:

* monetdb/e https://www.monetdb.org/ - сильно быстрее SQLite, но в многопотоке не пробовал.

* FireBird https://firebirdsql.org/ - традиционно любимая бухгалтерами :-)

или брать знакомое зло в виде Postgresql , MySQL 

 
Maxim Kuznetsov #:

собственно "давно обещанное большевиками случилось" :-(

а именно файловые блокировки

Режима когда их нет - НЕТ.

Возможны некоторые обходные пути, которые могут временно помочь (именно временно, потом всё равно те-же грабли):

* перенесите базу в RAM-диск

* у вас множество хендлов к базе - разделите кому не надо писать пусть будет read-only

* отключите auto-commit, оберните все запросы в TRANSACTION, а COMMIT/ROLLBACK вызывайте самостоятельно и обрабатывайте ошибки (повторы, переподключения, etc)

* как самый крайний случай добавьте RW-Mutex ко всем запросам. Это убьёт скорость напрочь (всё равно что однопоточно), но зато блокировки будут на уровень выше и не вызовут краха.

а вообще надо смотреть на другие базы пока не поздно.

из встраиваемых в приложения (не требующих отдельного сервера) и более менее близких с SQLite есть:

* monetdb/e https://www.monetdb.org/ - сильно быстрее SQLite, но в многопотоке не пробовал.

* FireBird https://firebirdsql.org/ - традиционно любимая бухгалтерами :-)

или брать знакомое зло в виде Postgresql , MySQL 

Я уже подумываю о смене Базы

Вот список Баз с которыми может работать FireDAC

База должна быть быстрой и бесплатной

Какую, по Вашему мнению, выбрать?

 
prostotrader #:

Я уже подумываю о смене Базы

Вот список Баз с которыми может работать FireDAC

База должна быть быстрой и бесплатной

Какую, по Вашему мнению, выбрать?

исключительно из требований "быстрый, бесплатный" и опций "легко найти помощь" и "может жить на Linux сервере" (вдруг захочется на хостинг и монстрячить веб-часть)

в списке, при всём богатстве выбора - Postgresql или MySQL , а кто из них - уже на вкус и цвет

MySQL попроще, Postgresql пофичастее