多租户数据源的基本数据源配置

时间:2019-07-08 08:38:26

标签: java postgresql dbcp

我已经实现了多租户,例如: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

请帮助我了解

  1. maxTotal太高了,因为它是根据 dataSource,我的租户数与我一样多
  2. maxTotal决不能在其postgres中大于max_connectionsn * maxTotal < max_connections其中n是租户i 有
  3. 我看到许多空闲连接,但是很少活动,因此maxIdle也太高了
  4. 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个租户...

0 个答案:

没有答案