Если мне не нужны транзакции, могу ли я повторно использовать одно и то же соединение с базой данных для нескольких запросов?Повторное использование соединения с базой данных для нескольких запросов
Колба документация says:
Поскольку соединения с базой данных инкапсулировать сделки, мы также должны убедиться, что только один запрос в то время использует соединение.
Вот как я понимаю смысл выше предложения:
Python соединение DB-API может обрабатывать только одну транзакцию в то время; чтобы начать новую транзакцию, сначала необходимо выполнить или отменить предыдущую. Поэтому, если каждому из наших запросов нужна собственная транзакция, то, конечно, каждый запрос нуждается в собственном подключении к базе данных.
Пожалуйста, дайте мне знать, если я ошибаюсь.
Но скажем, я установил режим автосохранения и обрабатываю каждый запрос в одном выражении SQL. Или, наоборот, допустим, что я только читал - не писал - в базу данных. В любом случае, кажется Я могу просто повторно использовать одно и то же соединение с базой данных для всех моих запросов, чтобы сохранить накладные расходы нескольких соединений. Но я не уверен, есть ли недостатки в этом подходе.
Редактировать: Я вижу одну проблему с тем, что я предлагаю: каждый запрос может обрабатываться другим процессом. Поскольку подключения должны быть probably not be reused across processes, позвольте мне уточнить мой вопрос: я имею в виду создание одного соединения для каждого процесса и его использование для всех запросов, которые будут обрабатываться этим процессом.
С другой стороны, вся точка (зеленых или родных) потоков обычно обслуживает один запрос на поток, поэтому мой предлагаемый подход подразумевает совместное соединение по потокам. Кажется one connection can be used concurrently in multiple native threads, но not in multiple green threads.
Так что давайте говорить о конкретности моей среды - это фляжка + gunicorn с несколькими многопоточными работниками синхронизации.
Существует еще один возможный случай, когда совместное использование соединений желательно, и именно тогда вы хотите, чтобы разные работники видели одни и те же грязные (незафиксированные) данные или делили состояние сеанса, такие как TEMPORARY таблицы, с курсорами HOLD и т. Д. Но это немного стрейч. –
@CraigRinger, но разные работники - это разные процессы (по крайней мере, в упряжке), и если все используют одно и то же соединение (и фактически используют его), я думал, что они столкнутся друг с другом (за предупреждения, указанные в моем вопросе). Или вы имели в виду, что можно использовать блокировки, чтобы избежать этой проблемы? – max
Если они разные * процессы *, они не могут обмениваться соединениями. (ОК, поэтому, если вы используете fork без exec или передаете сокет дочернему процессу, это возможно, но приведет только к хаосу, он не будет работать каким-либо полезным способом). –