首页 > 编程 > Java > 正文

spring基于通用Dao的多数据源配置详解

2019-11-26 10:09:44
字体:
来源:转载
供稿:网友

有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种方式和资源文件冲突;扫描映射文件的话,SqlSessionFactory的bean名字必须是sqlSessionFactory 他读不到sqlSessioNFactory2或者其他名字,最终解决方法如下:

1.在项目中加入如下类MultipleDataSource.java

package com.etoak.util;  import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;  public class MultipleDataSource extends AbstractRoutingDataSource {      private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();    public static void setDataSourceKey(String dataSource) {     dataSourceKey.set(dataSource);   }   @Override   protected Object determineCurrentLookupKey() {     // TODO Auto-generated method stub     return dataSourceKey.get();   }  } 

spring配置文件如下:

<beans xmlns="http://www.springframework.org/schema/beans"   xmlns:context="http://www.springframework.org/schema/context"   xmlns:p="http://www.springframework.org/schema/p"   xmlns:mvc="http://www.springframework.org/schema/mvc"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://www.springframework.org/schema/beans      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd     http://www.springframework.org/schema/context     http://www.springframework.org/schema/context/spring-context-3.2.xsd     http://www.springframework.org/schema/mvc     http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">    <context:component-scan base-package="com"/>      <mvc:annotation-driven/>       <context:property-placeholder location="classpath:db.properties"/>   <bean id="ds1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"     p:driverClassName="${mysql.driver}"     p:url="${mysql.url}"     p:username="${mysql.username}"     p:password="${mysql.password}"/>   <bean id="ds2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"     p:driverClassName="${mysql2.driver}"     p:url="${mysql2.url}"     p:username="${mysql2.username}"     p:password="${mysql2.password}"/>         <bean id="multipleDataSource" class="com.etoak.util.MultipleDataSource">     <property name="defaultTargetDataSource" ref="ds1"/>     <property name="targetDataSources">       <map>         <entry key="ds1" value-ref="ds1"/>         <entry key="ds2" value-ref="ds2"/>       </map>     </property>   </bean>      <bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean"     p:dataSource-ref="multipleDataSource"     p:mapperLocations="classpath:com/etoak/dao/*-mapper.xml"/>      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">     <property name="basePackage" value="com.etoak.dao"/>         <property name="markerInterface" value="com.etoak.dao.BaseDao" />   </bean>      </beans> 

测试类如下:

package com.etoak.test;  import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext;  import com.etoak.dao.ProductDaoIf; import com.etoak.util.MultipleDataSource;  public class Test {    public static void main(String[] args) {     ApplicationContext ac = new        FileSystemXmlApplicationContext("WebContent/WEB-INF/etoak-servlet.xml");          ProductDaoIf proDao = (ProductDaoIf)ac.getBean(ProductDaoIf.class);          MultipleDataSource.setDataSourceKey("ds1");     int count1 = proDao.selectProductCount();     MultipleDataSource.setDataSourceKey("ds2");     int count2 = proDao.selectProductCount();     System.out.println(count1);     System.out.println(count2);   }  } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表