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

来源:互联网 发布:开源电商系统 php 编辑:程序博客网 时间:2024/05/01 05:04

原文链接:http://blog.csdn.net/eagleking012/article/details/6853870

只要两步:

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

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

具体看以下代码文件。

[java] view plaincopyprint?
  1. public class MultiDataSourceBuilder implements ApplicationContextAware{  
  2.     private static final Log log = LogFactory.getLog(MultiDataSourceBuilder.class);  
  3.     private static ApplicationContext ac = null;  
  4.     public static void setAC(ApplicationContext ctx){  
  5.         ac = ctx;  
  6.     }  
  7.     public static DataSource getSpringBeanDataSource(String beanName){  
  8.         while(ac == null){  
  9.             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?
  1. }  

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

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

配置Spring bean 的配置文件是

[html] view plaincopyprint?
  1. <bean id="MultiDataSourceBuilder" class="com.myself.dataSource.MultiDataSourceBuilder">  
  2. </bean>  
  3. <bean id="dataSourceAbstract" class="org.apache.commons.dbcp.BasicDataSource" abstract="true">   
  4.     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />      
  5.     <property name="username"><value>username</value></property>     
  6.     <property name="password"><value>password</value></property>     
  7.     <property name="maxActive"><value>150</value></property>     
  8.     <property name="initialSize"><value>1</value></property>     
  9.     <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的连接池管理要方便的多,更重要的是可控性更好,耦合性更低。


0 0
原创粉丝点击