C3P0的多个数据源

时间:2014-11-06 17:38:28

标签: java jdbc connection-pooling c3p0

我正在开发一个工具,它接收不同的连接参数来测试不同数据库中的值(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

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

1 个答案:

答案 0 :(得分:1)

每个JDBC网址都需要不同的c3p0数据源。连接池必须包含同类连接:所有签出的连接必须从客户端的角度来看是等效的。如果来自多个数据库的Connections包含在同一个池中,则客户端将无法指定或知道与哪个数据库进行通信。

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

动态创建和配置c3p0 DataSource非常容易。请参阅示例代码here

如果将动态配置捕获为值为c3p0属性名称的映射,则还需要alternative, more concise way来获取具有该配置的DataSource。