草蛋的小青年

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

1,通过继承 spring 自带的 AbstractRoutingDataSource 方法 来 进行 数据源切换

 DbContextHolder 实现类

 1 public class DbContextHolder extends AbstractRoutingDataSource{
 2     
 3     public static final String DATA_SOURCE_DEFA = "dataSource1";
 4     public static final String DATA_SOURCE_FLOW = "dataSource2";
 5     
 6      private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
 7      
 8      /** 
 9          * 设置当前数据库。 
10          * @param dbType 
11          */  
12         public static void setDbType(String dbType)  
13         {  
14             contextHolder.set(dbType);  
15         }  
16       
17         /** 
18          * 取得当前数据源。 
19          * @return 
20          */  
21         public static String getDbType()  
22         {  
23             String str = (String) contextHolder.get();  
24             return str;  
25         }  
26           
27         /** 
28          * 清除上下文数据 
29          */  
30         public static void clearDbType()  
31         {  
32             contextHolder.remove();  
33         }
34 
35         @Override
36         protected Object determineCurrentLookupKey() {
37             // TODO Auto-generated method stub
38             return DbContextHolder.getDbType();  
39         }  
40      
41 }

  在 spring+ Mybatis 的数据源配置文件 中添加  dynamicDataSource 的切换方法

  这里通过JNDI 方式 获取数据源

 1 <bean id="dynamicDataSource" class="com.want.search.util.DbContextHolder" >
 2         <property name="targetDataSources">
 3             <map key-type="java.lang.String">
 4                 <!--通过不同的key决定用哪个dataSource-->
 5                 <entry value-ref="dataSource1" key="dataSource1"></entry>
 6                 <entry value-ref="dataSource2" key="dataSource2"></entry>
 7             </map>
 8         </property>
 9         <!--设置默认的dataSource-->
10         <property name="defaultTargetDataSource" ref="dataSource1"></property>
11     </bean>
12     
13     
14     
15     <bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
16         <property name="jndiName"><value>jdbc/SignBPM</value></property>   
17     </bean>  
18 
19     <bean id="dataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
20         <property name="jndiName"><value>jdbc/bpmflow</value></property>   
21     </bean>  

 在使用 切换数据源时的方法

1 DbContextHolder.setDbType(DbContextHolder.DATA_SOURCE_FLOW);

2 ,通过 spring +mybatis 中配置 多个SqlSessionFactoryTemp 来获得 不同的SqlSession 对象 来操作 不同 的数据库

 1  <!-- DBCP数据源的配置  bpmuser schema-->
 2   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"  
 3        destroy-method="close">  
 4        <property name="driverClassName" value="${jdbc1.driver}" />  
 5        <property name="url" value="${jdbc1.url}" />  
 6        <property name="username" value="${jdbc1.username}" />  
 7        <property name="password" value="${jdbc1.password}" />  
 8        <!-- 初始化连接大小 -->  
 9        <property name="initialSize" value="${initialSize}"></property>  
10        <!-- 连接池最大数量 -->  
11        <property name="maxActive" value="${maxActive}"></property>  
12        <!-- 连接池最大空闲 -->  
13        <property name="maxIdle" value="${maxIdle}"></property>  
14        <!-- 连接池最小空闲 -->  
15        <property name="minIdle" value="${minIdle}"></property>  
16        <!-- 获取连接最大等待时间 -->  
17        <property name="maxWait" value="${maxWait}"></property>  
18   </bean> 
19   
20   
21    <!-- DBCP数据源的配置  bpmuer2 schema -->
22   <bean id="dataSourceEx" class="org.apache.commons.dbcp.BasicDataSource"  
23        destroy-method="close">  
24        <property name="driverClassName" value="${jdbc2.driver}" />  
25        <property name="url" value="${jdbc2.url}" />  
26        <property name="username" value="${jdbc2.username}" />  
27        <property name="password" value="${jdbc2.password}" />  
28        <!-- 初始化连接大小 -->  
29        <property name="initialSize" value="${initialSize}"></property>  
30        <!-- 连接池最大数量 -->  
31        <property name="maxActive" value="${maxActive}"></property>  
32        <!-- 连接池最大空闲 -->  
33        <property name="maxIdle" value="${maxIdle}"></property>  
34        <!-- 连接池最小空闲 -->  
35        <property name="minIdle" value="${minIdle}"></property>  
36        <!-- 获取连接最大等待时间 -->  
37        <property name="maxWait" value="${maxWait}"></property>  
38   </bean> 
39   
40   
41      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
42          <property name="dataSource" ref="dataSource" />  
43          <!-- 自动扫描mapper.xml文件 -->  
44          <property name="mapperLocations" value="classpath:com/sun/search/mapper/*.xml"></property> 
45      </bean>  
46        
47     <bean id="sqlSessionFactoryEx" class="org.mybatis.spring.SqlSessionFactoryBean">
48         <property name="dataSource" ref="dataSourceEx" />
49         <!-- mapper扫描 -->
50         <property name="mapperLocations" value="classpath:com/sun/search/mapper/*.xml"></property>
51     </bean>
52     
53     <!-- 获取 sqlSessionTemplate 对象-->
54     <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
55         <constructor-arg ref="sqlSessionFactory" />
56     </bean>
57     
58      <!-- 获取 sqlSessionTemplateEx 对象-->
59     <bean id="sqlSessionEx" class="org.mybatis.spring.SqlSessionTemplate">
60         <constructor-arg ref="sqlSessionFactoryEx" />
61     </bean>
62     
63     
64    <!-- bpmuser schema (事务管理) -->  
65    <bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
66        <property name="dataSource" ref="dataSource" />  
67    </bean>
68    
69     <!-- bpmuser2 schema (事务管理) -->  
70    <bean name="transactionManagerEx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">   
71         <property name="dataSource" ref="dataSourceEx"></property>
72     </bean> 
View Code

 这样写的话要实现 dao 层 通过不同的Sqlsession 来操作 不同的数据源 ,不能直接通过Spring 来直接将Dao接口注入到service层

 1 @Repository
 2 public class FormInfoMapperImpl implements FormInfoMapper{
 3     
 4     private static Log logger =LogFactory.getLog(FormInfoMapperImpl.class);
 5     
 6     @Autowired
 7     private SqlSession sqlSession;
 8     
 9     @Autowired
10     private SqlSession sqlSessionEx;

 

posted on 2017-12-11 15:32  草蛋的小青年  阅读(382)  评论(0编辑  收藏  举报