我正在开发一种工具,该工具可以接收不同的连接参数以测试不同数据库中的值(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
如果没有,如何动态获取多个数据库的多个池?
最佳答案
每个JDBC网址都需要一个不同的c3p0数据源。连接池必须包含同构连接:从客户端的角度来看,所有签出的连接必须等效。如果来自多个数据库的连接包含在同一个池中,则客户端将无法指定或知道与之通信的数据库。
(例如,如果您正在复制一个只读数据库,并且您确实希望来自多个源的连接位于一个池中,因为从客户端的角度保证它们是等效的,则可以通过定义一个自定义来实现,循环使用或随机选择一个副本的未合并数据源,然后通过c3p0的DataSources工厂合并该数据源。)
动态创建和配置c3p0数据源非常容易。请参见示例代码here。
如果将动态配置捕获为c3p0属性名称到值的映射,则还有一个alternative, more concise way来获取具有该配置的数据源。