我可能根本不会在应用程序中连接池,我可能只是使用带有pgpool-II
or的服务器端连接池pgbouncer
。
如果我要使用应用程序内池,我会创建每个分片的连接池,然后从分片的适当池中选择一个连接。这将适用于任何允许您以编程方式而不是声明方式创建池的连接池实现。每个池都应该非常积极地尝试关闭非活动连接。看起来org.apache.tomcat.jdbc.pool.DataSource
很适合这个;请参阅Tomcat JDBC 池文档。
由于这将导致潜在的大量连接和大量连接/断开连接,因此运行服务器端连接池以限制和共享到每个分片的连接将非常重要。在每个分片上使用类似pgbouncer
或pgpool-II
处于事务池模式的东西,以在来自 Web Worker 的大量连接中共享相对少量的真实 PostgreSQL 连接。
我会说你会想要这样的模式:
web1 [pool1]-----------------------------[server1-pgbouncer]------[server1-pg]
[pool2]-------------------------------v ^
[pool3]---------v [server2-pgbouncer]-----------------[server2-pg]
| ^ |
[server3-pgbouncer]---------------------------[server3-pg]
| | |
web2 [pool3]---------^ | |
[pool2]-------------------------------| |
[pool1]------------------------------------------
每个应用程序池都连接到与该池对应的分片服务器上的 pgbouncer,并且只有该分片服务器的 pgbouncer 会与分片的 PostgreSQL 实例对话。