java动态配置数据源_Java Spring4配置动态数据源(AbstractRoutingDataSource )

Spring配置多数据源的方式和具体使用过程。

Spring对于多数据源,以数据库表为参照,大体上可以分成两大类情况:

一是,表级上的跨数据库。即,对于不同的数据库却有相同的表(表名和表结构完全相同)。

二是,非表级上的跨数据库。即,多个数据源不存在相同的表。

Spring2.x的版本中采用Proxy模式,就是我们在方案中实现一个虚拟的数据源,并且用它来封装数据源选择逻辑,这样就可以有效地将数据源选择逻辑从Client中分离出来。Client提供选择所需的上下文(因为这是Client所知道的),由虚拟的DataSource根据Client提供的上下文来实现数据源的选择。

具体的实现就是,虚拟的DataSource仅需继承AbstractRoutingDataSource实现determineCurrentLookupKey()在其中封装数据源的选择逻辑。

动态配置多数据源

1、 数据源的名称常量类:package com.frogking.datasource;

public class DataSourceConst {

public static final String Admin="admin";

public static final String User = "user";

}

2、建立一个获得和设置上下文环境的类,主要负责改变上下文数据源的名称:package com.frogking.datasource;

package com.frogking.datasource;

public class DataSourceContextHolder {

private static final ThreadLocal contextHolder = new ThreadLocal(); // 线程本地环境

// 设置数据源类型

public static void setDataSourceType(String dataSourceType) { contextHolder.set(dataSourceType);

}

// 获取数据源类型

public static String getDataSourceType() {

return (String) contextHolder.get();

}

// 清除数据源类型

public static void clearDataSourceType () {

contextHolder.remove();

}

}

3、建立动态数据源类,注意,这个类必须继承AbstractRoutingDataSource,且实现方法 determineCurrentLookupKey,该方法返回一个Object,一般是返回字符串:package com.frogking.datasource;

package com.frogking.datasource;

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

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override

protected Object determineCurrentLookupKey() {

return DataSourceContextHolder.getDataSourceType();

}

}

4、编写spring的配置文件配置多个数据源<?xml  version="1.0" encoding="UTF-8"?>

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-2.5.xsd">

class="org.springframework.jdbc.datasource.DriverManagerDataSource"

id="parentDataSource">

value="com.mysql.jdbc.Driver">

root

root

jdbc:mysql://localhost:8806/test

jdbc:mysql://localhost:8906/test2

id="dataSource">

ref="adminDataSource">

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"

id="sessionFactory">

com/frogking/entity/User.hbm.xml

com/frogking/entity/Admin.hbm.xml

org.hibernate.dialect.MySQLDialect

true

false

false

2

key="hibernate.bytecode.use_reflection_optimizer">

true

5、写dao层

6、编写测试类测试是否成功package com.frogking.test;

import static org.junit.Assert.fail;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.frogking.dao.IUserDao;

import com.frogking.datasource.DataSourceConst;

import com.frogking.datasource.DataSourceContextHolder;

import com.frogking.entity.User;

public class UserTest {

ApplicationContext  ac= new ClassPathXmlApplicationContext("applicationContext.xml");

IUserDao userDao =(IUserDao)ac.getBean("userDao");

@Test

public void testSave() {

//hibernate创建实体

DataSourceContextHolder.setDataSourceType(DataSourceConst.Admin);//设置为另一个数据源

User user=new User();

user.setName("user001");

user.setPassword("001");

userDao.save(user);//使用dao保存实体

DataSourceContextHolder.setDataSourceType(DataSourceConst.User);//设置为另一个数据源

userDao.save(user);//使用dao保存实体到另一个库中

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值