【问题标题】:Multiple Data sources for C3P0C3P0 的多个数据源
【发布时间】:2014-11-06 17:38:28
【问题描述】:

我正在开发一个工具,它接收不同的连接参数来测试不同数据库中的值(jNRPE 中的 Nagios 插件,它保持与不同数据库的开放连接)。 因为配置是动态的(可能有更多数据库,也可以删除它们)我不能有配置文件。

我想知道我是否应该为每个数据库创建一个 C3P0 实例,或者我是否可以使用相同的实例并在每次请求连接时更改 URL?

代码在github: https://github.com/angoca/db2-jnrpe/blob/master/src/main/java/com/github/angoca/db2_jnrpe/database/pools/c3p0/DBCP_c3p0.java

如果没有,如何动态获取多个数据库的多个池?

【问题讨论】:

  • 我也有类似的要求。您能否帮助我如何为多个数据库创建多租户数据库连接池。所以基本上我想在实例级别创建连接池(不想为每个数据库创建连接池)并根据请求我会询问特定数据库的连接并访问数据库

标签: java jdbc connection-pooling c3p0


【解决方案1】:

您需要为每个 JDBC url 使用不同的 c3p0 数据源。连接池必须包含同质连接:从客户端的角度来看,所有签出的连接必须是等效的。如果来自多个数据库的连接包含在同一个池中,客户端将无法指定或知道他们正在与哪个数据库通信。

(如果您正在复制只读数据库,并且您确实希望来自多个源的连接存在于单个池中,因为从客户端的角度来看,它们保证是等效的,您可以通过定义一个自定义的、非池化的数据源,循环或随机选择一个复制者,然后通过 c3p0 的数据源工厂池化数据源。)

动态创建和配置 c3p0 数据源非常容易。见示例代码here

如果您将动态配置捕获为 c3p0 属性名称到值的映射,那么还有一个 alternative, more concise way 可以获取具有该配置的 DataSource。

【讨论】:

  • 我也有类似的要求。您能否帮助我如何为多个数据库创建多租户数据库连接池。所以基本上我想在实例级别创建连接池(不想为每个数据库创建连接池)并根据请求我会询问特定数据库的连接并访问数据库
  • @SANDHYASINGH,您可以在 spring 中使用 org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource 来实现。它使用查找键来标识要连接的数据库。在我的应用程序中,我创建了一个扩展 AbstractRoutingDataSource 的类,然后存储了一个映射(键是用户 sessionId,值是数据库名称)。当用户登录时,我使用 userId 作为键来查找要连接的最终数据库。希望有帮助
猜你喜欢
  • 2012-10-07
  • 2014-08-21
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2013-04-25
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多