eagleking012的CSDN专栏
只要两步:
1、定义一个类MultiDataSourceBuilder实现ApplicationContextAware,在里面定义一个静态的获取SpringBean的方法。
2、配置Spring Bean配置,让Spring管理MultiDataSourceBuilder 和BasicDataSource
具体看以下代码文件。
public class MultiDataSourceBuilder implements ApplicationContextAware{ private static final Log log = LogFactory.getLog(MultiDataSourceBuilder.class); private static ApplicationContext ac = null; public static void setAC(ApplicationContext ctx){ ac = ctx; } public static DataSource getSpringBeanDataSource(String beanName){ while(ac == null){ try { Thread.sleep(1000); System.out.println("DataBase is not ready,wait for 1s!"); } catch (InterruptedException e) { e.printStackTrace(); } } if(beanName.startsWith("java:comp/env/jdbc/orcl")){ beanName = beanName.substring(beanName.lastIndexOf("orcl")); return (DataSource)ac.getBean(beanName); }else if(beanName.startsWith("orcl")){ return ((DataSource)ac.getBean(beanName)); } } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ac = applicationContext; }}实现ApplicationContextAware接口的类,会由Spring自动调用setApplicationContext方法来设置applicationContext属性,不用再自己写代码设置。
接下来就是配置数据源Bean。
配置Spring bean 的配置文件是
<bean id="MultiDataSourceBuilder" class="com.myself.dataSource.MultiDataSourceBuilder"> </bean> <bean id="dataSourceAbstract" class="org.apache.commons.dbcp.BasicDataSource" abstract="true"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="username"><value>username</value></property> <property name="password"><value>password</value></property> <property name="maxActive"><value>150</value></property> <property name="initialSize"><value>1</value></property> <property name="maxWait"><value>60000</value></property> <property name="maxIdle"><value>20</value></property> <property name="minIdle"><value>3</value></property> <property name="removeAbandoned"><value>true</value></property> <property name="removeAbandonedTimeout"><value>180</value></property> <property name="validationQuery"><value>select 1 from dual</value></property> <property name="connectionProperties"><value>clientEncoding=UTF-8</value></property> </bean> <!--以下配置数据库资源名称和连接URL--> <bean id="orcl201" destroy-method="close" parent="dataSourceAbstract"> <property name="url" value="jdbc:oracle:thin:@192.168.1.201:1521:orcl" /> </bean> <bean id="orcl205" destroy-method="close" parent="dataSourceAbstract"> <property name="url" value="jdbc:oracle:thin:@192.168.1.205:1521:orcl" /> </bean> <bean id="orcl209" destroy-method="close" parent="dataSourceAbstract"> <property name="url" value="jdbc:oracle:thin:@192.168.1.209:1521:orcl" /> </bean> <!--以上配置数据库资源名称和连接URL--> </beans>Spring可以方便的抽取bean的公共属性定义在一个抽象bean中,其它bean只要配置父类引用即可。
这样就可以在程序中的任何地方,通过静态方法获取数据库连接池了。比tomcat的基于JNDI的连接池管理要方便的多,更重要的是可控性更好,耦合性更低。