我已经实现了多租户,例如:http://blog.trixi.cz/2012/01/multitenancy-using-spring-and-postgresql/
TL; DR::我有一个postgres数据库,其中每个租户都有一个架构。我正在使用java apache dbcp2来配置连接池。对于每个租户,我都在地图中保留了BasicDataSource,对于每个请求,我都在此地图中查找了dataSource以获取该租户的连接。每个数据源都为其租户设置了正确的路径。
我正在尝试为此设置找出可行的连接池配置。
直到现在,我都使用了一些随机的,绝对错误的配置,如下所示:
maxTotal 100
maxIdle 30
maxWaitMillis 10000
testOnBorrow true
testWhileIdle true
validationQuery select 1
minEvitableIdleTimeMillis 300000
timeBetweenEvictionRunsMillis -1
removeAbandonedOnMaintenance true
removeAbandonedOnBorrow true
在postgres中,我有以下设置:
max_connections 100
使用这种配置,我现在遇到了例外情况:
org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections
请帮助我了解
maxTotal
太高了,因为它是根据
dataSource,我的租户数与我一样多maxTotal
决不能在其postgres中大于max_connections
,n * maxTotal < max_connections
其中n
是租户i
有maxIdle
也太高了timeBetweenEvictionRunsMillis
设置为-1
会使设置minEvictableIdleTimeMillis
处于未使用状态,因为逐出线程根本不会运行因此,我的下一个方法将更像这样:
maxTotal 8
maxIdle 2
minIdle 0
maxWaitMillis 30000
testOnBorrow true
validationQuery select 1
removeAbandonedOnMaintenance true
removeAbandonedOnBorrow true
所以我想让每个租户保持并发连接,最多允许8个连接。我还想将空闲连接减少到最低限度,因此没有租户可以保持太多连接徘徊。
这里还会出现更多问题:
我需要退出线程才能使maxIdle工作吗?即我应该设置timeBetweenEvictionRunsMillis
吗?
我应该考虑使用另一种连接池机制,例如pgBouncer吗?我猜一个人可以使用一个共享数据库将我的设置解释为许多独立的应用程序,因此需要pgBouncer ...
是否有一些根据租户数量配置池的非静态方法?说,今天我有20个租户,也许下周我将有40个租户...