Как разделить соединение БД как сеанс между разными пользователями? - PullRequest
1 голос
/ 18 июля 2011

Мы используем Soaplib - Soap Server с apache / mod_wsgi и sqlalchemy в качестве ORM для соединения mysql.

Мы пытались использовать global dict для хранения сеанса db, обработанного соединением sqlalchemy - makesession.

Но когда мы перемещаем наш код в производственную среду, используя mod_wsgi, он не будет работать, поскольку он создает разные процессы для каждого запроса

Так что в настоящее время мы установили WSGIDaemonProcess example processes=1 threads=1, но это не так.не является хорошим решением.

Что может быть идеальным решением для использования глобального пула соединений с БД для совместного использования сеанса БД по всем запросам?

1 Ответ

0 голосов
/ 18 июля 2011

Новый процесс не создается для каждого запроса. Вероятнее всего, вы работали во встроенном режиме с Apache prefork MPM. Apache создаст много процессов для обработки запросов, и ваши запросы, вероятно, будут обрабатываться различными процессами по очереди. В конце концов запросы будут возвращаться и обрабатываться процессом, который использовался ранее, и таким образом попадать в кешированное соединение.

В общем, использование встроенного режима и prefork MPM - плохая идея. Используйте режим демона и сделайте ваш код безопасным для потоков и используйте многопоточный процесс. Если вы не понимаете, как сделать потокобезопасным код, используйте небольшое количество процессов в однопоточном режиме. Т.е..,

WSGIDaemonProcess example processes=4 threads=1
WSGIProcessGroup example

Это все же лучше, чем Apache prefork MPM и встроенный режим, потому что это фиксированное число, где, как и во встроенном режиме, число может вырасти до гораздо большего, и Apache также может завершать и перезапускать процессы. В режиме демона процессы всегда будут постоянными в этой конфигурации.

...