ItGo.me - 专注IT技术分享

首页 > Spring > spring配置 > spring配置多数据源

spring配置多数据源

时间:2016-07-25来源:网友分享 点击:

项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源。例如在一个spring和hibernate的框架的项目中,我们在spring配置中往往是配置一个dataSource来连接数据库,然后绑定给sessionFactory,在dao层代码中再指定sessionFactory来进行数据库操作。

正如上图所示,每一块都是指定绑死的,如果是多个数据源,也只能是下图中那种方式。

可看出在Dao层代码中写死了两个SessionFactory,这样日后如果再多一个数据源,还要改代码添加一个SessionFactory,显然这并不符合开闭原则。

那么正确的做法应该是

代码如下:

1. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="" xmlns:xsi="" xmlns:util="" xmlns:context="" xmlns:tx="" xmlns:aop="" xsi:schemaLocation=" http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${db.conn.url}" /> <property name="username" value="${db.conn.userName}" /> <property name="password" value="${db.conn.password}" /> <property name="initialSize" value="0" /> <property name="maxActive" value="${db.conn.maxActive}" /> <property name="maxIdle" value="${db.conn.maxIdle}" /> <property name="minIdle" value="0" /> <property name="maxWait" value="${db.conn.maxWait}" /> <!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> --> <property name="validationQuery" value="${validationQuery}" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <property name="minEvictableIdleTimeMillis" value="25200000" /> <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="1800" /> <property name="logAbandoned" value="true" /> <!-- <property name="filters" value="stat" /> --> <property name="filters" value="mergeStat" /> </bean> <bean name="dataSourcePerson" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="url" value="${person.db.conn.url}" /> <property name="username" value="${person.db.conn.userName}" /> <property name="password" value="${person.db.conn.password}" /> <property name="initialSize" value="0" /> <property name="maxActive" value="${db.conn.maxActive}" /> <property name="maxIdle" value="${db.conn.maxIdle}" /> <property name="minIdle" value="0" /> <property name="maxWait" value="${db.conn.maxWait}" /> <!-- <property name="poolPreparedStatements" value="true" /> <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> --> <property name="validationQuery" value="${validationQuery}" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="testWhileIdle" value="true" /> <property name="timeBetweenEvictionRunsMillis" value="60000" /> <property name="minEvictableIdleTimeMillis" value="25200000" /> <property name="removeAbandoned" value="true" /> <property name="removeAbandonedTimeout" value="1800" /> <property name="logAbandoned" value="true" /> <!-- <property name="filters" value="stat" /> --> <property name="filters" value="mergeStat" /> </bean> <bean id="multipleDataSource" class="com.hnlat.common.util.MultipleDataSource"> <property name="defaultTargetDataSource" ref="dataSource"/> <property name="targetDataSources"> <map> <entry key="dataSource" value-ref="dataSource"/> <entry key="dataSourcePerson" value-ref="dataSourcePerson"/> </map> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="multipleDataSource" /> <property name="hibernateProperties"> <props> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> </props> </property> <property name="packagesToScan"> <list> <value>com.hnlat.***.domain</value> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="add*" /> <tx:method name="save*" /> <tx:method name="update*" /> <tx:method name="modify*" /> <tx:method name="edit*" /> <tx:method name="delete*" /> <tx:method name="remove*" /> <tx:method name="repair" /> <tx:method name="deleteAndRepair" /> <tx:method name="get*" propagation="SUPPORTS" /> <tx:method name="find*" propagation="SUPPORTS" /> <tx:method name="load*" propagation="SUPPORTS" /> <tx:method name="search*" propagation="SUPPORTS" /> <tx:method name="datagrid*" propagation="SUPPORTS" /> <tx:method name="*" propagation="SUPPORTS" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="transactionPointcut" expression="execution(* com.hnlat.*.service..*Impl.*(..))" /> <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" /> </aop:config> </beans>


2.MultipleDataSource.java

这个数据源类 有方法设置数据源的KEY就能切换数据源了


构建Spring Boot系统及相关配置详解

概要 前面我们讲述了如何搭建一个简单的 Spring Boot 应用(参见Spring Boot - 初探),这里,我们来学习如何对项目进行...

spring MVC配置详解

现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了。不过...

JTable内容居中显示

1. 软件版本阶段说明* Alpha版: 此版本表示该软件在此阶段主要是以实现软件功能为主,通常只在软件开发者内部交流...

项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。多数据源让人最头痛的,不是
------分隔线----------------------------