如何在不同用户间共享数据库连接?

1 投票
1 回答
1481 浏览
提问于 2025-04-16 21:45

我们正在使用Soaplib,这是一个基于Apache和mod_wsgi的Soap服务器,同时用SQLAlchemy作为MySQL的数据库连接工具。

我们尝试使用global dict来存储由SQLAlchemy处理的数据库会话,也就是makesession连接。

但是,当我们把代码搬到生产环境,使用mod_wsgi时,这个方法就不管用了,因为它为每个请求创建了不同的进程。

所以目前我们设置了WSGIDaemonProcess example processes=1 threads=1,但这并不是一个好的解决方案。

那么,有什么理想的解决办法可以使用全局的数据库连接池,以便在所有请求之间共享数据库会话呢?

1 个回答

0

每次请求并不是都会创建一个新的进程。你可能是在使用Apache的嵌入模式和prefork MPM。Apache会创建很多进程来处理请求,而你的请求可能会轮流被不同的进程处理。最终,请求会返回,并由之前使用过的进程来处理,因此就会使用到缓存的连接。

一般来说,使用嵌入模式和prefork MPM并不是个好主意。应该使用守护进程模式,并确保你的代码是线程安全的,使用多线程的进程。如果你不明白怎么让代码线程安全,那就使用少量的单线程守护进程模式的进程。也就是说,

WSGIDaemonProcess example processes=4 threads=1
WSGIProcessGroup example

这比Apache的prefork MPM和嵌入模式要好,因为在守护进程模式下,进程的数量是固定的,而在嵌入模式下,数量可能会变得很大,Apache也可能会杀掉并重启进程。而在守护进程模式下,进程会一直保持在那个配置状态。

撰写回答