использовать SQLite в Django в производстве? - PullRequest
25 голосов
/ 02 августа 2011

Извините за этот вопрос, я не знаю, понял ли я эту концепцию, но SQLite является Serverless, это означает, что база данных находится на локальной машине, и она хранится в одном файле, этот файл доступен только в одном режиме: если один клиент читает его, он предназначен только для режима чтения для других клиентов, а если клиент пишет, то все клиенты имеют режим записи, поэтому только в одном режиме одновременно! так что представьте, что я сделал приложение django, например, блог; тогда как это сделать с помощью sqlite? поскольку, если клиент входит в блог, он переходит в режим чтения, чтобы увидеть страницу и записи в блоге, и если зарегистрированный клиент пытается добавить комментарий, то файл будет создан как режим записи, так как же это может обработать sqlite? Итак, SQLite здесь, как BaseHTTPServer (сервер, поставляемый с django), для тестирования и обучения?

Ответы [ 5 ]

37 голосов
/ 03 августа 2011

Различные базы данных управляют параллелизмом по-разному, но в sqlite используется метод глобальной блокировки на уровне базы данных.Только один поток или процесс может вносить изменения в базу данных sqlite одновременно;все другие параллельные процессы будут вынуждены ждать завершения текущего запущенного процесса.

По мере роста вашего числа пользователей;Простая стратегия блокировки sqlite приведет к все большему конфликту блокировок, и вам нужно будет перенести ваши данные в другую базу данных, такую ​​как MySQL (которая может выполнять блокировку на уровне строк, по крайней мере, с движком InnoDB) или PostgreSQL (которая использует Multiversion Concurrency Control),Если вы ожидаете, что получите значительное количество пользователей (например, более 1 запроса в секунду в течение большей части дня), вам следует перейти с SQLite;и чем раньше вы это сделаете, тем легче будет.

8 голосов
/ 02 августа 2011

Эта проблема в теории баз данных называется параллелизмом, и SQLite поддерживает ее в версиях Windows> Win98 и других местах в соответствии с часто задаваемыми вопросами:

http://www.sqlite.org/faq.html#q5

Нам не известно ни о каком другом встроенном ядре базы данных SQL, которое бы поддерживало много параллелизма как SQLite. SQLite позволяет нескольким процессам иметь файл базы данных, открытый сразу, и для нескольких процессов, чтобы прочитать База данных сразу. Когда какой-либо процесс хочет написать, он должен заблокировать Весь файл базы данных на время его обновления. Но это нормально занимает всего несколько миллисекунд. Другие процессы просто ждут писателя закончить и продолжить заниматься своими делами. Другой встроенный SQL Механизмы базы данных обычно позволяют подключаться только одному процессу база данных сразу.

По сути, не беспокойтесь о параллелизме, любая база данных, достойная своей заботы, прекрасно справляется. Более подробную информацию о том, как SQLite3 управляет этим, можно найти здесь . Вам, как разработчику, а не разработчику базы данных, не нужно заботиться об этом, если вы не заинтересованы во внутренней работе.

7 голосов
/ 19 августа 2016

SQLite - это , а не , как BaseHTTPServer или что-то в этом роде.Это полнофункциональная встроенная база данных.Довольно быстро тоже.Его язык SQL может не обладать наибольшим количеством наворотов, но он достаточно гибок.Я не сталкивался со случаями, когда мне нужно что-то, что он не может сделать для проектов, в которых я участвовал (которые, если честно, не обычные веб-приложения).для производства, не обсуждая фактический дизайн не говорит вам много.SQLite довольно быстрый.В некоторых случаях буквально на порядков быстрее, чем, скажем, Postgres, который выступает в качестве альтернативы среди джангонавтов.Как кто-то указал, он также поддерживает много параллелизма.Вопрос в том, подпадает ли ваше приложение под «некоторые случаи» или нет.

Теперь есть один важный фактор, который необходимо учитывать.SQLite - это внутренняя база данных.Это действительно важно.Если вы используете что-то вроде gevent, вы можете столкнуться с крайними случаями, когда ваше приложение ломается.Например, попытка выполнить транзакцию, в которой у вас есть переключение контекста, может привести к ужасному разрыву транзакции.Другими словами, «параллелизм» действительно зависит от вашего приложения, потому что SQLite является частью вашего приложения.

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

С другой стороны, находясь в-process означает, что добавление пользовательских функций и агрегатов довольно тривиально.Я не уверен, что ORM в Django делает это более трудным, чем должно быть, но вы можете придумать довольно хороший дизайн, использующий эти функции.

1 голос
/ 15 августа 2018

Опоздал на вечеринку, но по состоянию на середину 2018 г. вопрос все еще актуален.

«Клиент» сайта блога - это иной термин, как «клиент базы данных». В документации SQLite клиент рассматривается как процесс, открывающий файл базы данных. Такой процесс, скажем, приложение django, может обрабатывать множество клиентов веб-приложений («пользователей») одновременно, и с точки зрения SQLiite он все еще будет одним клиентом.

Важным соображением при выборе SQLite вместо правильной СУБД является то, состоит ли ваша архитектура из нескольких программных компонентов, подключающихся к базе данных. В таком случае использование SQLite может стать серьезным узким местом в производительности из-за того, что каждому приложению необходим доступ к одному и тому же файлу БД, возможно, по сети.

Если несколько приложений (клиентов баз данных) не подходят, SQLite - отличный выбор для производства в 99% случаев. Оставшиеся 1% - это приложения, использующие определенные функции БД, приложения под огромной нагрузкой и т. Д.

Знай свою архитектуру.

0 голосов
/ 02 августа 2011

SQLite на самом деле не предназначен для производства.Довольно легко настроить и запустить MySQL или PostgreSQL, даже в Windows, и иметь настоящую базу данных.

Настоящая проблема заключается в том, что SQLite3 не поддерживает потоки в Django, поэтому одновременно может выполняться только одно представление PAGE.на вашем сервере, смотрите эту ошибку https://code.djangoproject.com/ticket/12118

Я не использую SQLite3 даже в разработке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...