Как на уровне кода правильно реализовать работу SQLite3 и обрабатывать запросы к БД?
Вопрос не о составлении SQL запросов. Интернет заполонён миллионами гайдов по открытию соединения, записи, чтению бд, но вопрос более практического характера я не находил.. Условный Телеграм Бот на aiogram. У него может быть большая аудитория, что равняется большому потоку обращений к БД, будь то частная музыкальная школа и ее студенты, тех. поддержка сервиса, бот для знакомств, бот с викторинами и т.п. Не будет же рабочим решением на каждый запрос обращаться к файлу открывать соединение с бд, записывать-читать данные, коммитить, если команда на запись, закрывать соединение и так по кругу на каждый запрос? Может есть какой-то стандарт обертки, менеджер для работы с sqlite3? Какие-то стандарты для решения данного вопроса? Может при первом запросе к бд открывать соединение и запускать таймер на 60 сек и собирать запросы в общую очередь, а там уже раскидывать запись, потом, если запросы прекратились, коммитить все полученные данные или не знаю.. Будут ведь какие-нибудь конфликты чтения-записи и данные могут быть потеряны и надо соблюдать очередь чтения записи. Какие варианты есть? Особенно вопрос возникает при работе асинхронной работой кода.
Для правильного вопроса надо знать половину ответа
Sqlite вообще плохо походит для одновременной работы из нескольких потоков.
Для более-менее серьёзной работы лучше взять MySQL или PostgreSQL. Чтобы не открывать постоянно соединения надо использовать пул.
igreklpofrss, был у меня опыт работы с SQLite3. Ответчик правильно пишет, что это не очень хороший вариант. Смотрите изначально на варианты, которые он указал, это значительно функциональнее субд
shurshur, что такого надо делать что бы упереться в производительность sqlite?
Проверил сейчас на обычном офисном компе(селероне) запись в sqlite в 10 потоков строк размером около 500кбайт(фейковые сгенерированные имя фамилия фото итп) - получилось 1000+ строк в секунду.
За пару минут база заняла несколько гбайт.
Чтение из базы идет параллельно, на время записи база блокируется полностью а желающие доступиться тупо ждут, но если не писать в нее такими дикими темпами то время блокировки - миллисекунды.
theurus, sqlite - это не полноценная база данных, а жалкое подобие, которое используют тогда, когда полноценную базу поднять неудобно. Однако для полноценного онлайн-сервиса с нормальной аудиторией это даже рассматривать неприлично. Не потому что упрётся или не упрётся. А потому что так приличный сервис можно реализовать только от отчаянья.
Вам вот ответили, что sqlite не очень подходит для этого, а вы сразу "в данный момент интересует sqlite"
Какое подключение отключение? sqlite это не база данных, это библиотека работы с конретным файлом. Файл открывается обычными средствами системы. И если две программы или два потока попробуют его открыть одновременно на запись, будет проблема в виде задержек.
Если у вас бот с множеством подключений и нужна параллельная работа, вам нужна именно отдельная база данных, любая.
sqlite может множественно читать, а писать - с блокировками.
Вопрос не такой простой, как может показаться.
Может я и не прав, но, по-моему, использование SQLite перекладывает заботу о разных аспектах на разработчика, что вынуждает его переходить на другие СУБД, в которых эти вещи учтены.
SQLite позволяет работу с множественными читателями, но для множественных писателей необходимо откладывать запросы (при помощи очереди), пока текущая запись не будет выполнена.
Пул соединений не поддерживается в SQLite и поэтому нужно вести учёт соединений в самом приложении.