有一个使用 PostgreSQL DBMS 用 Python3/Flask 编写的 WEB 应用程序。假设用户打开页面http://mysite.ru/并且在那一刻服务器 python 应用程序向 PostgreSQL 发出一系列请求以生成响应页面
哪个更好?为什么:
- 每次连接到 DBMS,发出请求,接收响应并断开连接;
- 在应用程序启动时创建一个到 DBMS 的连接并单独通过它执行所有查询
有一个使用 PostgreSQL DBMS 用 Python3/Flask 编写的 WEB 应用程序。假设用户打开页面http://mysite.ru/并且在那一刻服务器 python 应用程序向 PostgreSQL 发出一系列请求以生成响应页面
哪个更好?为什么:
在架构上,PostgreSQL 是为少量长寿命连接而设计的。这不是关于打开 tcp 连接和身份验证的开销,而是关于这个 DBMS 的内部结构。因此,当打开新连接时,会通过调用生成一个单独的操作系统进程
fork。CPU 系统时间已经以fork每秒数百个速度显着增长,系统响应能力下降。什么是网络 300 rps?这不是很多。然后,每个基本后端进程(即直接为连接提供服务并执行查询)在其私有内存中存储一堆有用的东西,从系统目录缓存到存储过程的字节码。
并且在共享内存段中,支持不同的结构,这对于协调并行进程的工作是必要的。
因此,live PostgreSQL 仅用于连接池。在应用程序端或外部,例如
pgbouncer. 也就是说,最多可以直接与数据库建立 N 个连接(通常池会根据需要保存连接,从 0 到数据库可以处理的并发请求数的合理配置限制)。应用程序在需要时从池中获取连接,并在完成必要的请求后将其返回。两者都经常使用:应用程序上的池和外部 pgbouncer 池,它可以让您更好地压缩数据库连接,例如,如果您有 2 个应用程序服务器。
或者,准确回答建议的选项:第二点的变体,但不是一个连接,而是一定数量的连接。