`

多数据源的配置和切换

阅读更多
[color=green]
项目中用到过多数据源之间的切换,从网络上搜寻到的相关资料结合自己的实践,把它记录下来,以备需要时查询。
一、数据源的配置。
代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
		"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
	  <!-- 数据源定义-->
	 <bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName">
           <value>com.mysql.jdbc.Driver</value>
       </property>
       <property name="url">
           <value>jdbc:mysql://localhost:3306/tenpay_db?user=tenpay&amp;password=cft2008</value>
       </property>
       <property name="username">
           <value>tenpay</value>
       </property>
       <property name="password">
           <value>cft2008</value>
       </property>
    </bean> 
    
     <bean id="fcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName">
           <value>com.mysql.jdbc.Driver</value>
       </property>
       <property name="url">
           <value>jdbc:mysql://localhost:3306/c2c_db?user=tenpay&amp;password=cft2008</value>
       </property>
       <property name="username">
           <value>tenpay</value>
       </property>
       <property name="password">
           <value>cft2008</value>
       </property>
    </bean> 
    
    <bean id="dataSource" class="com.ben.util.DynamicDataSource">
	   <property name="targetDataSources">
	      <map key-type="com.ben.util.CustomerType">
	         <entry key="fcds" value-ref="fcDataSource"/>
	         <entry key="myds" value-ref="myDataSource"/>
	      </map>
	   </property>
	   <property name="defaultTargetDataSource" ref="fcDataSource"/>
	</bean>
     
</beans>

数据源枚举类:
代码:
/**
 * <pre>
 * Title: 		CustomerType.java
 * Project: 	tenpay_Admin
 * Type:		com.ben.util.CustomerType
 * Author:		ben.liu
 * Create:	 	2008-11-25 下午05:12:49
 * Copyright: 	Copyright (c) 2008
 * Company:		
 * <pre>
 */
package com.ben.util;

/**
 * <pre>
 * 数据源枚举类
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-11-25
 */
public enum CustomerType
{
	fcds,
	myds
}

动态数据源:
代码:
/**
 * <pre>
 * Title: 		DynamicDataSource.java
 * Project: 	tenpay_Admin
 * Type:		com.ben.util.DynamicDataSource
 * Author:		ben.liu
 * Create:	 	2008-11-25 下午02:26:46
 * Copyright: 	Copyright (c) 2008
 * Company:		
 * <pre>
 */
package com.ben.util;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;


/**
 * <pre>
 * 动态数据源
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-11-25
 */
public class DynamicDataSource extends AbstractRoutingDataSource
{

	@Override
	protected Object determineCurrentLookupKey() {
		return CustomerContextHolder.getCustomerType();
	}
	
}

数据源切换类:
代码:
/**
 * <pre>
 * Title: 		CustomerContextHolder.java
 * Project: 	tenpay_Admin
 * Type:		com.ben.util.CustomerContextHolder
 * Author:		ben.liu
 * Create:	 	2008-11-25 下午02:22:52
 * Copyright: 	Copyright (c) 2008
 * Company:		
 * <pre>
 */
package com.ben.util;

/**
 * <pre>
 * 数据源切换类
 * </pre>
 * @author ben.liu
 * @version 1.0, 2008-11-25
 */
public class CustomerContextHolder
{
	private static final ThreadLocal<CustomerType> contextHolder = new ThreadLocal<CustomerType>();

	public static void setCustomerType(CustomerType customerType)
	{
		contextHolder.set(customerType);
	}

	public static CustomerType getCustomerType()
	{
		return (CustomerType) contextHolder.get();
	}

	public static void clearCustomerType()
	{
		contextHolder.remove();
	}
}

当需要数据库操作时,需要在操作前增加这段代码即可:
CustomerContextHolder.setCustomerType(CustomerType.myds);

[/color]
分享到:
评论
7 楼 hiben 2016-10-09  
  • [list]
  • [*][list]
  • [*][*]
  • [*]
  • [/list]
  • [/list]
    6 楼 bqmcjl 2013-06-18  
    大哥。我项目里边怎么没有AbstractRoutingDataSource这个包啊,导入说找不到这个包怎么解决啊
    5 楼 benlsoft 2009-09-10  
    crabboy 写道
    事务怎么控制?

    事务最好用全局事务,用全局事务才能保证,具体我也没有去试过。呵呵。
    4 楼 crabboy 2009-07-27  
    事务怎么控制?
    3 楼 benlsoft 2009-02-25  
    已经写得很清楚了,只要按这几步就可以切换不同数据源。
    1.数据源要几个就配置几个,配置好了。
    2.在枚举类中加下配置好的数据源键值。
    3.在数据库操作时要用到某个数据源时,只需添加一句:CustomerContextHolder.setCustomerType(CustomerType.xxxx),即可(xxx代表你要切换的数据源键名)。
    2 楼 心素闲 2009-02-06  
    我的没切换成功。
    1 楼 心素闲 2009-02-06  
    能说得再详细些么?最近刚好要用到多数据源。

    相关推荐

    Global site tag (gtag.js) - Google Analytics