博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring多数据源配置
阅读量:5735 次
发布时间:2019-06-18

本文共 6067 字,大约阅读时间需要 20 分钟。

注:本文来源于 : 《》

项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此。多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源。例如在一个spring和hibernate的框架的项目中,我们在spring配置中往往是配置一个dataSource来连接数据库,然后绑定给sessionFactory,在dao层代码中再指定sessionFactory来进行数据库操作。

20130429104020090

正如上图所示,每一块都是指定绑死的,如果是多个数据源,也只能是下图中那种方式。

20130429105150794

可看出在Dao层代码中写死了两个SessionFactory,这样日后如果再多一个数据源,还要改代码添加一个SessionFactory,显然这并不符合开闭原则。

那么正确的做法应该是

20130429111107055

代码如下:

1. applicationContext.xml

classpath:com/resource/config.properties
org.hibernate.dialect.MySQLDialect
org.springframework.orm.hibernate4.SpringSessionContext
false
true
create
com.po

2. DynamicDataSource.class

package com.core;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource{	@Override	protected Object determineCurrentLookupKey() {		return DatabaseContextHolder.getCustomerType();	}}
3. DatabaseContextHolder.class
package com.core;public class DatabaseContextHolder {	private static final ThreadLocal
contextHolder = new ThreadLocal
(); public static void setCustomerType(String customerType) { contextHolder.set(customerType); } public static String getCustomerType() { return contextHolder.get(); } public static void clearCustomerType() { contextHolder.remove(); }}
4. DataSourceInterceptor.class
package com.core;import org.aspectj.lang.JoinPoint;import org.springframework.stereotype.Component;@Componentpublic class DataSourceInterceptor {	public void setdataSourceOne(JoinPoint jp) {		DatabaseContextHolder.setCustomerType("dataSourceOne");	}	public void setdataSourceTwo(JoinPoint jp) {		DatabaseContextHolder.setCustomerType("dataSourceTwo");	}}

5. po实体类

package com.po;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "BTSF_BRAND", schema = "hotel")public class Brand {	private String id;	private String names;	private String url;	@Id	@Column(name = "ID", unique = true, nullable = false, length = 10)	public String getId() {		return this.id;	}	public void setId(String id) {		this.id = id;	}	@Column(name = "NAMES", nullable = false, length = 50)	public String getNames() {		return this.names;	}	public void setNames(String names) {		this.names = names;	}	@Column(name = "URL", length = 200)	public String getUrl() {		return this.url;	}	public void setUrl(String url) {		this.url = url;	}}
package com.po;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name = "CITY", schema = "car")public class City {	private Integer id;	private String name;	@Id	@Column(name = "ID", unique = true, nullable = false)	public Integer getId() {		return id;	}	public void setId(Integer id) {		this.id = id;	}	@Column(name = "NAMES", nullable = false, length = 50)	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}}

6. BrandDaoImpl.class

package com.dao.one;import java.util.List;import javax.annotation.Resource;import org.hibernate.Query;import org.hibernate.SessionFactory;import org.springframework.stereotype.Repository;import com.po.Brand;@Repositorypublic class BrandDaoImpl implements IBrandDao {	@Resource	protected SessionFactory sessionFactory;	@SuppressWarnings("unchecked")	@Override	public List
findAll() { String hql = "from Brand"; Query query = sessionFactory.getCurrentSession().createQuery(hql); return query.list(); }}

7. CityDaoImpl.class

package com.dao.two;import java.util.List;import javax.annotation.Resource;import org.hibernate.Query;import org.hibernate.SessionFactory;import org.springframework.stereotype.Repository;import com.po.City;@Repositorypublic class CityDaoImpl implements ICityDao {	@Resource	private SessionFactory sessionFactory;	@SuppressWarnings("unchecked")	@Override	public List
find() { String hql = "from City"; Query query = sessionFactory.getCurrentSession().createQuery(hql); return query.list(); }}
8. DaoTest.class
package com.test;import java.util.List;import javax.annotation.Resource;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import org.springframework.test.context.transaction.TransactionConfiguration;import com.dao.one.IBrandDao;import com.dao.two.ICityDao;import com.po.Brand;import com.po.City;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = "classpath:com/resource/applicationContext.xml")@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = false)public class DaoTest {	@Resource	private IBrandDao brandDao;	@Resource	private ICityDao cityDao;	@Test	public void testList() {		List
brands = brandDao.findAll(); System.out.println(brands.size()); List
cities = cityDao.find(); System.out.println(cities.size()); }}
用aop,达到动态更改数据源的目的。当需要增加数据源的时候,我们只需要在applicationContext配置文件中添加aop配置,新建个DataSourceInterceptor即可。而不需要更改任何代码。

转载于:https://www.cnblogs.com/ios9/p/10771458.html

你可能感兴趣的文章
C语言入门基础之数组——数学和编程的完美结合(图)
查看>>
《远见》的读后感作文1000字范文
查看>>
重置密码、单用户模式、救援模式
查看>>
LAMP环境搭建1-mysql5.5
查看>>
第三课 Linux目录及文件管理、用户组管理及bash重定向
查看>>
shell 脚本攻略--小试牛刀
查看>>
spring boot view override
查看>>
bzoj 2282: [Sdoi2011]消防
查看>>
我的友情链接
查看>>
centos5.9使用RPM包搭建lamp平台
查看>>
关于C#面向对象2
查看>>
Javascript String类的属性及方法
查看>>
vim编辑器如何添加或删除多行注释
查看>>
[LeetCode] Merge Intervals
查看>>
iOS开发-按钮的基本使用
查看>>
在QT和SDL搭建的框架中使用OPENGL在SDL窗口上进行绘图
查看>>
REST技术第三步 @BeanParam的使用
查看>>
SharePoint 读取 Site Columns 的数据并绑定到DropdownList
查看>>
Python中的对象行为与特殊方法(二)类型检查与抽象基类
查看>>
使用 axios 详解
查看>>