2016-11-08 7 views
2

Если мне не нужны транзакции, могу ли я повторно использовать одно и то же соединение с базой данных для нескольких запросов?Повторное использование соединения с базой данных для нескольких запросов

Колба документация 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 с несколькими многопоточными работниками синхронизации.

ответ

1

Основано на @Craig Ringer comment on a different question, я думаю, что знаю ответ.

Единственное возможное преимущество совместного использования соединений - производительность (другие факторы - например, инкапсуляция транзакций и простота - благоприятствуют отдельному соединению для каждого запроса). И поскольку соединение не может быть разделено между процессами или зелеными потоками, у него есть только шанс с родными потоками. Но psycopg2 (и, предположительно, другие драйверы) не разрешает одновременный доступ из одного и того же соединения. Поэтому, если каждый запрос не тратит очень мало времени на разговор с базой данных, скорее всего, это связано с производительностью, а не выгодой от совместного использования.

+0

Существует еще один возможный случай, когда совместное использование соединений желательно, и именно тогда вы хотите, чтобы разные работники видели одни и те же грязные (незафиксированные) данные или делили состояние сеанса, такие как TEMPORARY таблицы, с курсорами HOLD и т. Д. Но это немного стрейч. –

+0

@CraigRinger, но разные работники - это разные процессы (по крайней мере, в упряжке), и если все используют одно и то же соединение (и фактически используют его), я думал, что они столкнутся друг с другом (за предупреждения, указанные в моем вопросе). Или вы имели в виду, что можно использовать блокировки, чтобы избежать этой проблемы? – max

+0

Если они разные * процессы *, они не могут обмениваться соединениями. (ОК, поэтому, если вы используете fork без exec или передаете сокет дочернему процессу, это возможно, но приведет только к хаосу, он не будет работать каким-либо полезным способом). –

Смежные вопросы