Найти - Пользователи
Полная версия: Связь сессии и подключения в SQLAlchemy
Начало » Базы данных » Связь сессии и подключения в SQLAlchemy
1
Товарищ
Конечная цель – бональная многопользовательская БД на MySQL с Web-интерфейсом (FreeBSD/Apache/mod_python). У каждого пользователя – отдельное подключение, персональный лог и свои права на доступ к таблицам. Вот что я сделал:

import sqlalchemy.engine as engine
import os
from sqlalchemy.orm import sessionmaker

Session = sessionmaker(autoflush = True, transactional = True)
mysql_db = engine.create_engine('mysql://localhost/information_schema')
conn = mysql_db.connect()
sess = Session(bind = conn)

def handler(req):
global sess
conn = sess.connection()
req.content_type = 'text/plain'
req.write('pid = %d\n' % os.getpid())
req.write('thread_id = %d\n' % conn.connection.thread_id())
req.write('-----------------\n')
return 0
Как я понял из документации по SQLAlchemy в данном случае у каждой сессии должно быть свое отдельное подключение к БД. Т. е. запросы посланные с одного компьютера/браузера могут обслуживаться разными процессами, но обращаться они будут всегда к одному подключению. На деле получается:

pid = 2879
thread_id = 60
-----------------

pid = 2881
thread_id = 62
-----------------

pid = 2879
thread_id = 60
-----------------

...
Получается. что подключение привязано к процессу.
Чего же мне не хватает и можно ли это сделать на SQLAlchemy?
Товарищ
Собственно вопрос вот в чем:
Может ли пул соединений (connection pool) совместно использоваться несколькими процессами (не потоками!)?

Это важно, потому что реально Apache выбирает любой свободный процесс для обработки запроса (request) в рамках одной и той же сессии (см. например, The Process/Interpreter Model). А если первый запрос пользователя, в котором он подключился к БД под именем “Иванов” обслуживался процессом 451, а второй процессом 470, в котором это подключение недоступно, то такая телега никуда не поедет. Как же все это работает?
ZZZ
Я к вебу отношение имею смутное но мои знания говорят следующее…
Исторически сложилось так, что среднестатистический веб-сервер для каждого запроса создаёт новый процесс. Есть штучки вроде fastcgi, для которых это немного нарушается, но тебе явно не поможет…
Даже если тебя съели, у тебя есть два выхода. Так вот, ты можешь использовать что-нить для межпроцессного взаимодействия, например, dbus. Но это, имхо, будет Ужос летящий на крыльях ночи. Очень не быстро летящий. Второй вариант – какой-нить объектный фреймвок, например django или zope. Если нужно что-нить более низкоуровневое, то посмотри на wsgi, на котором все эти фреймвоки и основаны.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB