Как настроить SQLite?

GreenWay

Client
Регистрация
11.05.2012
Сообщения
432
Благодарностей
139
Баллы
43
Как настроить SQLite? Может кто сталкивался?
Суть вот в чем.
Поставил сначала сервер MySQL, с ним стало еще немерянно лишнего софта(я с этим пока не сталкивался вот и ставил все подряд), потом удалил, потом снова поставил и начались ошибки, ни в какую не удалялся mysql-connector и я плюнул на все это дело. Есть у меня конечно и хостинг с MySQL, но решил что локально было-бы надежней.
Обратил внимание на SQLite - никакого сервера, легкое подключение, простота в обращении, базу можно легко перенести(это просто файл) - и взялся за нее.
Написал шаблон на get запросах. Принцип прост - берется ID юзера(список .txt, повторов нет) - get запросом вытягиваем инфу и пишем в бд.
В бд около 11 колонок, 1 - ID(autoinkrement, unic), 2 - ID_user(unic), 3 - ID_login(unic), остальные неважно. В шаблоне настроен цикл на 50 проверок ID.
В один поток шаб работает отлично, все пишется.
А вот в 20 потоков полезли ошибки -
1) Сначала SQLite - ошибка записи в бд именно по ID_user (он должен быть уникальным, но каким-то образом появились дубли. Хотя в работе со списком стоит взятие с удалением) - костыль такой- сначала проверяю ID_user в бд (SELECT и проверка результата на !=''), если уже есть, беру следующий. Дублей стало значительно меньше, но все равно проскакивают.
2) Потом полезли ошибки при запросе SELECT - поставил паузу и повторный запрос к бд - то-же немного стало получше.
3) И окончательно добило - ошибка взятия из файла ID_user - там просто список чисел от 1 до 1000000 - почему - непойму?

Так вот о вопросе. В SQLite нет, как таковой, многопоточности на запись в бд, отсюда и ошибки записи.
Поискав решение этой проблемы Но с недавних пор появилась такая штука как WAL - https://sqlite.org/wal.html Вот только где что поменять чтоб включить? Можно еще как-то timeout задавать?
 

Lord_Alfred

Client
Регистрация
09.10.2015
Сообщения
3 916
Благодарностей
3 867
Баллы
113
1) Сначала SQLite - ошибка записи в бд именно по ID_user (он должен быть уникальным, но каким-то образом появились дубли. Хотя в работе со списком стоит взятие с удалением) - костыль такой- сначала проверяю ID_user в бд (SELECT и проверка результата на !=''), если уже есть, беру следующий. Дублей стало значительно меньше, но все равно проскакивают.
Не знаю ты или нет, но кто-то писал с неделю-две назад в зенно чатике в скайпе, что было тоже самое.
 

GreenWay

Client
Регистрация
11.05.2012
Сообщения
432
Благодарностей
139
Баллы
43
Нет, не я. Решение, я так понимаю одно, - другая бд...
Не дает покоя высказывание из этого поста https://habrahabr.ru/post/149356/, а именно
Изначально SQlite работал по принципу «многие читают — один пишет».
То есть только одно соединение пишет в БД в данный момент времени. Если другие соединения попробуют тоже записать, то словят ошибку SQLITE_BUSY.
Можно, однако, ввести таймаут операций. Тогда подключение, столкнувшись с занятостью БД, будет ждать N секунду прежде, чем отвалиться с ошибкой SQLITE_BUSY.

И как быть?

Либо одно подключение и все запросы через него, либо исходить из возможного таймаута и предусмотреть повтор выполнения SQL.
Есть и еще одна возможность: не так давно появился новый вид лога SQlite: Write Ahead Log, WAL.
Если включить для БД именно этот режим лога, то несколько подключений смогут одновременно модифицировать БД.
Но в этом режиме БД уже занимает несколько файлов.

Ну понятно теперь почему SQLite — ужасна, ведь у нее нет ГЛОБАЛЬНОГО КЭША?

Действительно, все современные RDBMS немыслимы без глобального разделяемого кэша, который может хранить всякие ништяки вроде скомпилированных параметризованных запросов. Этим занят сервер, которого тут нет. Однако, в рамках одного приложения SQlite может разделять кэш между несколькими подключениями (читать тут: www.sqlite.org/sharedcache.html) и немного сэкономить память.

А почему все жалуются, что SQLite — тормозит?

Две причины. Первая — настройки по умолчанию. Они работают на надежность, а не на производительность.
Вторая — непонимание механизма фиксации транзакций. По умолчанию после любой команды SQlite будет фиксировать транзакцию (то есть ожидать пока БД окажется в целостном состоянии для отключения питания). В зависимости от режима паранойи SQLite потратит на это от 50 до 300 мс (ожидая окончания записи данных на диск).

Что делать-то? Мне нужно вставить 100 тыс записей и быстро!

Удалить индексы, включить режим синхронизации OFF (или NORMAL), вставлять порциями по N тысяч (N — подобрать, для начала взять 5000). Перед вставкой порции сделать BEGIN TRANSACTION, после — COMMIT.
Вот только как правильно настроить?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Юзай постгрес и не мучай себя
 
  • Спасибо
Реакции: GreenWay

DmitryAk

Client
Регистрация
14.12.2016
Сообщения
860
Благодарностей
824
Баллы
93
Я бы в качестве простой бд еще Firebird порекомендовал бы. Он местами туговат, но хранение всей бд в одном файле, который можно забэкапить/перенести, удобство работы и еще некоторые фишки иногда решают. Из минусов - его надо уметь готовить.

Юзай постгрес и не мучай себя
Можно чуть раскрыть мысль, почему именно постгрес? Я с ним буквально раза два сталкивался по мелочи, поэтому его плюсов/минусов не знаю.
 

GreenWay

Client
Регистрация
11.05.2012
Сообщения
432
Благодарностей
139
Баллы
43

GreenWay

Client
Регистрация
11.05.2012
Сообщения
432
Благодарностей
139
Баллы
43
ПО совету Radzhabа решил юзать PostgreSQL и не мучаться.
Установил PostgreSQL, драйвера ODBC.
Через Navicat создаю бд, открываю и редактирую бд, проверяю запросы. Но вот беда - как к ZENNO прицепить PostgreSQL?
Через odbc создаю подключение, проверяю - "Success" при запросе ошибка именно в дровах. Может их как-то настраивать нужно?
Radzhab помоги пожалуйста.
 

GreenWay

Client
Регистрация
11.05.2012
Сообщения
432
Благодарностей
139
Баллы
43
Создал новую тему "Как в ZENNO подключить PostgreSQL" ТУТ
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Поставил сначала сервер MySQL, с ним стало еще немерянно лишнего софта(я с этим пока не сталкивался вот и ставил все подряд), потом удалил, потом снова поставил и начались ошибки, ни в какую не удалялся mysql-connector и я плюнул на все это дело. Есть у меня конечно и хостинг с MySQL, но решил что локально было-бы надежней.
Поставили бы Open Server и не было бы мучений таких.
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)