利用Spring 和DBCP实现分布式动态数据库连接池管理

只要两步:

1、定义一个类MultiDataSourceBuilder实现ApplicationContextAware,在里面定义一个静态的获取SpringBean的方法。

2、配置Spring Bean配置,让Spring管理MultiDataSourceBuilder 和BasicDataSource

具体看以下代码文件。



[java] view plaincopyprint?
01.public class MultiDataSourceBuilder implements ApplicationContextAware{
02. private static final Log log = LogFactory.getLog(MultiDataSourceBuilder.class);
03. private static ApplicationContext ac = null;
04. public static void setAC(ApplicationContext ctx){
05. ac = ctx;
06. }
07. public static DataSource getSpringBeanDataSource(String beanName){
08. while(ac == null){
09. try {
10. Thread.sleep(1000);
11. System.out.println("DataBase is not ready,wait for 1s!");
12. } catch (InterruptedException e) {
13.
14. e.printStackTrace();
15. }
16. }
17.
18. if(beanName.startsWith("java:comp/env/jdbc/orcl")){
19. beanName = beanName.substring(beanName.lastIndexOf("orcl"));
20. return (DataSource)ac.getBean(beanName);
21. }else if(beanName.startsWith("orcl")){
22. return ((DataSource)ac.getBean(beanName));
23. }
24. }
25.
26. public void setApplicationContext(ApplicationContext applicationContext)
27. throws BeansException {
28. ac = applicationContext;
29. }


[java] view plaincopyprint?
01.}

实现ApplicationContextAware接口的类,会由Spring自动调用setApplicationContext方法来设置applicationContext属性,不用再自己写代码设置。

接下来就是配置数据源Bean。

配置Spring bean 的配置文件是



[html] view plaincopyprint?
01.<bean id="MultiDataSourceBuilder" class="com.myself.dataSource.MultiDataSourceBuilder">
02.</bean>
03.<bean id="dataSourceAbstract" class="org.apache.commons.dbcp.BasicDataSource" abstract="true">
04. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
05. <property name="username"><value>username</value></property>
06. <property name="password"><value>password</value></property>
07. <property name="maxActive"><value>150</value></property>
08. <property name="initialSize"><value>1</value></property>
09. <property name="maxWait"><value>60000</value></property>
10. <property name="maxIdle"><value>20</value></property>
11. <property name="minIdle"><value>3</value></property>
12. <property name="removeAbandoned"><value>true</value></property>
13. <property name="removeAbandonedTimeout"><value>180</value></property>
14. <property name="validationQuery"><value>select 1 from dual</value></property>
15. <property name="connectionProperties"><value>clientEncoding=UTF-8</value></property>
16.</bean>
17.<!--以下配置数据库资源名称和连接URL-->
18.<bean id="orcl201" destroy-method="close" parent="dataSourceAbstract">
19. <property name="url" value="jdbc:oracle:thin:@192.168.1.201:1521:orcl" />
20.</bean>
21.<bean id="orcl205" destroy-method="close" parent="dataSourceAbstract">
22. <property name="url" value="jdbc:oracle:thin:@192.168.1.205:1521:orcl" />
23.</bean>
24.<bean id="orcl209" destroy-method="close" parent="dataSourceAbstract">
25. <property name="url" value="jdbc:oracle:thin:@192.168.1.209:1521:orcl" />
26.</bean>
27.<!--以上配置数据库资源名称和连接URL-->
28.</beans>

Spring可以方便的抽取bean的公共属性定义在一个抽象bean中,其它bean只要配置父类引用即可。



这样就可以在程序中的任何地方,通过静态方法获取数据库连接池了。比tomcat的基于JNDI的连接池管理要方便的多,更重要的是可控性更好,耦合性更低。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值