|
|
|
|
|
6.24, uldus (ok), 22:57, 25/03/2010 [^] [^^] [^^^] [ответить] [п©б╘п▒Б┬≥Б∙≈ п©б╘п▒Б┬≥Б∙≥п©б╘п▒Б┬≥Б∙⌡п©б╘п▒Б┬≥Б∙▓п©б╘п▒Б┬≥я▒я▐Б√░п▒Б√═Б■─п©б╘п▒Б┬≥ц╥я▐Б√░п▒Б√═Б√└п©б╘п▒Б┬≥Б∙⌡я▐Б√░п▒Б√═Б■─я▐Б√░п▒Б√═Б√▒]
| +/– |
>sql-запрос к базе 1,5 Мб никак не может выполняться 5-10 секунд, проблема
>явно в вашем коде.
Проблема явно в блокировках при попытке одновременного обращения нескольких процессов к базе. Про deadlock в sqlite я уже не раз слышал. Код типовой и предельно упрощен (т.е. SELECT список/поле по проиндексированному ключу без подзапросов и сложностей), на других СУБД работает отлично.
>В одном из проектов меня порядка тысячи клиентов документооборота онлайн, пара сот
>гигов динамического трафика в месяц и база эскулайт в несколько гигабайт
http://www.sqlite.org/faq.html
(5) Can multiple applications or multiple instances of the same application access a single database file at the same time?
When SQLite tries to access a file that is locked by another process, the default behavior is to return SQLITE_BUSY. You can adjust this behavior from C code using the sqlite3_busy_handler() or sqlite3_busy_timeout() API functions.
При такой организации блокировки на уровне всей базы в любом случае удел SQLite - однопользовательские системы. Или специально под SQLite писать программу с оглядкой на диспетчеризацию запросов.
В http://www.sqlite.org/lockingv3.html я ничего кардинально улучшающее ситуацию с блокировками не нашел.
>тесты здесь:
>http://geomapx.blogspot.com/search/label/SQLite
Это линейные тесты, вы измеряйте скорость последовательного выполнения действий. Протестируйте, что будет при большом конкурирующем числе одновременных обращений.
| |
|
7.25, Veter (??), 23:52, 25/03/2010 [^] [^^] [^^^] [ответить] [п©б╘п▒Б┬≥Б∙≈ п©б╘п▒Б┬≥Б∙≥п©б╘п▒Б┬≥Б∙⌡п©б╘п▒Б┬≥Б∙▓п©б╘п▒Б┬≥я▒я▐Б√░п▒Б√═Б■─п©б╘п▒Б┬≥ц╥я▐Б√░п▒Б√═Б√└п©б╘п▒Б┬≥Б∙⌡я▐Б√░п▒Б√═Б■─я▐Б√░п▒Б√═Б√▒]
| –1 +/– |
> Про deadlock в sqlite я уже не раз слышал. ...
Улыбнуло. Где тесты?
> При такой организации блокировки на уровне всей базы в любом случае удел SQLite - однопользовательские системы...
Про "однопользовательские системы", наверное, описка. Или 1000 конкурирующих процессов одного пользователя не считается?..
В жестком диске одна головка пишет в один поток - делаете ли вывод, что удел жестких дисков - однозадачные системы? А одноядерный процессор может выполнять только одну процессорную инструкцию одновременно - делаете ли вы вывод, что такие процессоры - только для однозадачных систем?
Ровно так же есть встроенная очередь запросов в эскулайте. Посмотрите sqlite3_busy_timeout(), о котором сказано в процитированном вами фрагменте.
> Протестируйте, что будет при большом конкурирующем числе одновременных обращений.
Тестировал на сотне _одновременных_ обращений. Все ок, уже года два как. Ранее были определенные проблемы, которые я ловил тестами и решал с апстримом - но все давно починили. Впрочем, и до этого вовсю использовал эскулайт в нагруженных веб-сервисах, только приходилось применять разные хитрости, которые теперь не нужны.
В качестве послесловия: если вы во времена ядра 2.4 на какие-то грабли встали, это вовсе не означает, что они есть и сейчас. Попробуйте последние версии эскулайт.
| |
|
|
|
|
|
|
|