所以我最近开始意识到 PgBouncer 并且我正在努力了解它如何替换多线程服务器上的连接池。我查看了HikariCP/Apache DBCP2 和 PgBouncer,但它似乎没有解决这个问题。
假设我有一个 Java 服务器处理每个线程的请求,它通过 JDBC 连接到数据库。 JDBC 驱动程序应该是线程安全的,但同一连接上的请求一次只能处理一个。像 Hikari 这样的池允许每个线程获取一个现有连接(通过不必为每个请求建立新连接来节省时间),然后专门用于该线程内的数据库事务(在有其他同时请求时节省时间)。
pgbouncer 究竟是如何解决这两个问题的?如果我使用所有线程共享的到 pgbouncer 的单个全局连接,我们仍然会遇到阻塞问题。如果我为每个请求创建一个连接,我们仍然有与 pgbouncer 建立连接的开销(我知道这比连接到数据库便宜,但这看起来仍然很奇怪)。
你说得对,与 Pgbouncer 建立连接比与 DB 建立连接更便宜。它是常规的 TCP 连接,与 DB 的连接相比,CPU 和内存消耗更大。是的,它会增加一些延迟,但如果您在与实例相同的数据中心使用 pgbouncer,对于 AWS 来说它应该是一或几毫秒。如果您有多个实例使用共享池而不是实例本地池访问数据库,那么这种延迟开销可能比您从更有效地管理连接中获得的收益小得多