spring多数据源的实现

1、多数据源以JNDI形式为例(其他的形式同理,在配置数据源地方配置多个即可)
     在tomcat中的context.xml文件中配置多个数据源。

   例如:

     <Resource

       name="jdbc/zlxt0"               

       type="javax.sql.DataSource" 

       password="bpms"

       driverClassName="oracle.jdbc.driver.OracleDriver"

       maxIdle="5"

       maxWait="5000"

       username="bpms"

       url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"

       maxActive="100"/>

      <Resource

       name="jdbc/zlxt1"               

       type="javax.sql.DataSource" 

       password="bpms1"

       driverClassName="oracle.jdbc.driver.OracleDriver"

       maxIdle="5"

       maxWait="5000"

       username="bpms1"

       url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"

       maxActive="100"/>

      <Resource

       name="jdbc/zlxt2"               

       type="javax.sql.DataSource" 

       password="czwd0216"

       driverClassName="oracle.jdbc.driver.OracleDriver"

       maxIdle="5"

       maxWait="5000"

       username="czwd0216"

       url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"

       maxActive="100"/>

2、spring的配置文件applicationContext.xml中配置多个jndi,并配置数据源.

例如:
<jee:jndi-lookup id="ds0" jndi-name="java:comp/env/jdbc/zlxt0"/>
    <jee:jndi-lookup id="ds1" jndi-name="java:comp/env/jdbc/zlxt1"/>
    <jee:jndi-lookup id="ds2" jndi-name="java:comp/env/jdbc/zlxt2"/>
// 下文中 class="app.util.mulds.DynamicDataSource"> 是扩展的处理类(参见步骤3)
<bean id="dataSource" class="app.util.mulds.DynamicDataSource">     
            <property name="targetDataSources">     
               <map key-type="java.lang.String">     
                  <entry key="0" value-ref="ds0"/>  
                  <entry key="1" value-ref="ds1"/> 
                  <entry key="2" value-ref="ds2"/> 
               </map>     
            </property>    
             <property name="defaultTargetDataSource" ref="ds1"/> 
</bean>

3、步骤2中的DynamicDataSource类的具体的实现

public class DynamicDataSource extends AbstractRoutingDataSource {

	@Override
	protected Object determineCurrentLookupKey() {
		return DBContextHolder.getDsKey();
	}

}

 4步骤3中的DBContextHolder类的实现

public class DBContextHolder {
	private static final ThreadLocal contextHolder = new ThreadLocal();
	
	public static void setDsKey(String dsKey){
		contextHolder.set(dsKey);
	}
	
	public static String getDsKey(){
		return (String)contextHolder.get();
	}
	
}

 5、在BO层中的新添加如下2行代码(如果不添加这2行代码,则程序调用时默认数据源)

// ChangeDsImpl1 是给开发人员进行业务扩展用的,即开发人员可以实现业务规则判断调用哪个数据源的代码地方(如果该方法需要添加参数,开发人员可任意修改)

ChangeDsImpl1 changeDsImpl1 = new ChangeDsImpl1();

//将业务处理规则判断出的数据源用于这次处理。
DBContextHolder.setDsKey(changeDsImpl1.getDsKey());

6、类ChangeDsImpl1<!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]-->

public class ChangeDsImpl1 {

	@根据参数返回数据源的Key
	public String getDsKey(String... parms) {
			return "2";
}

}

 7、文档中涉及到的代码对应的文件都在附件中,可以参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值