JDBC连接池管理器

时间:2014-06-09 06:53:05

标签: jdbc c3p0 apache-commons-dbcp bonecp jdbc-pool

我们正在使用PHP重写使用Java的Web应用程序。我想,但我不确定,我们可能会遇到有关连接池的问题。应用程序本身是多租户的,是“独立数据库”和“单独模式”的组合。

对于每个Postgres数据库服务器实例,可以有多个数据库(名为schemax_XXX),其中包含多个架构(架构为租户)。注册时,可能会发生以下两种情况之一:

  1. 在编号最高的schema_XXX数据库中创建新的租户架构。
  2. 注册过程发现数据库已完全分配并创建新的schemas_XXX + 1数据库。在此新数据库中,将创建租户架构。
  3. 所有租户都通过中央注册局(也是Postgres数据库)了解。建立会话后,注册表将解析租户的主机,数据库和架构,并为该HTTP请求建立数据库会话

    现在,我认为我在这里看到的问题有两个:

    1. 应用程序启动时定义JDBC连接池。我的意思是所有数据库(主机+数据库)在启动时都是已知的。这与注册过程冲突。
    2. 当我写这篇文章的时候,我们有~20个数据库服务器和~1000个数据库(总计~100k(租户)模式。鉴于这些数字,我需要为每个应用程序实例提供20 * 1000个数据源我假设所有池也在同一时间也开始了。我不确定池分配了多少资源,但对于20k池来说它必须是非常重要的。
    3. 那么,甚至假设可以使用连接池是否可行?

      对于第一个问题,我想可以使用支持JMX的池,并且在创建新的schemas_XXX数据库时创建新的数据源。更大的问题是大量的池。为此,我想,应该使用某种池管理器,它可以终止没有打开连接的池(并且按需启动池)。我没有找到任何支持这一点的东西。

      我有哪些选择?或者我应该咬紧牙关然后回到PgBouncer之外的进程外连接池,并为每个请求建立一个普通的JDBC连接,类似于我们现在用PHP处理它的方式?

1 个答案:

答案 0 :(得分:1)

一些事情:

  1. 仅在应用程序启动时不需要实例化连接池。您可以随时创建或销毁它们;
  2. 您显然不希望每个数据库或架构急切地创建一个连接池,以便始终打开。如果你这样做,你需要保持至少20000或100000个连接,甚至在你到达DataSource使用的非连接资源之前就是非启动器;
  3. 如果对特定租户的连接请求很可能倾向于集群,那么您可能会考虑延迟,动态实例化池,并在一段时间后销毁它们,如果它们暂时没有处理请求的话。
  4. 祝你好运!