通过AbstractRoutingDataSource实现动态数据源

标签: abstractroutingdatasource 数据 | 发表时间:2014-09-13 16:25 | 作者:lalahei
出处:http://www.iteye.com

项目中用到了动态数据源,所以在这里做下记录。

 

AbstractRoutingDataSource中route是路由的意思,单从名字,我们就可以看出这个类是做什么用的

 

动态数据源是指,同一个数据库访问接口,根据上下文不通,可以利用不同的数据源访问数据库。 项目中采用了spring jdbc来访问数据库,配置文件如下:

 

<!--sqlMapClient配置-->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
         <property name="dataSource" ref="dataSource" />
         <property name="configLocation"      value="xxxxxx" />
</bean>

<!--数据源配置-->
<bean id="dataSource" class="继承类AbstractRoutingDataSource">
	<property name="targetDataSources">
		<!--配置多个数据源-->	
	</property>
</bean>

 spring中提供了类AbstractRoutingDataSource来实现动态数据源,这个类实现了DataSource接口,getConnection()方法如下:

 

public Connection getConnection() throws SQLException {
	return determineTargetDataSource().getConnection();
}

protected DataSource determineTargetDataSource() {
	Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
	Object lookupKey = determineCurrentLookupKey();
	DataSource dataSource = this.resolvedDataSources.get(lookupKey);
	if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
		dataSource = this.resolvedDefaultDataSource;
	}
	if (dataSource == null) {
		throw new IllegalStateException("Cannot determine target DataSource for lookup key [" + lookupKey + "]");
	}
	return dataSource;
}

 在getConnection方法中又调用了方法determineTargetDataSource,在这个方法中,只是返回一个数据源对象,但是返回哪个数据源对象呢,玄机在Object lookupKey = resolveSpecifiedLookupKey(entry.getKey());

这行代码,我们可以在自己的实现类中去定制这个方法,根据自己的要求来确定具体返回哪一个数据源对象

 

每一次DAO接口调用,都会有一个线程上下文,我可以把需要使用哪一个数据源的信息放到线程变量中,然后再AbstractRoutingDataSource的实现类中,我可以像下面那样重写determineCurrentLookupKey方法

private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
    
 @Override
 protected Object determineCurrentLookupKey() {
        return contextHolder.get();
 }

 这样每个线程间相互隔离,也不会担心线程安全问题

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [abstractroutingdatasource 数据] 推荐:

通过AbstractRoutingDataSource实现动态数据源

- - 编程语言 - ITeye博客
项目中用到了动态数据源,所以在这里做下记录. AbstractRoutingDataSource中route是路由的意思,单从名字,我们就可以看出这个类是做什么用的. 动态数据源是指,同一个数据库访问接口,根据上下文不通,可以利用不同的数据源访问数据库. 项目中采用了spring jdbc来访问数据库,配置文件如下:.

数据仓库

- Ran - Linux@SOHU
翻译:马少兵、曾怀东、朱翊然、林业. 尽管服务器存储、处理能力得到有效的提高,以及服务器价格的降低,让人们能够负担起大量的服务器,但是商业软件应用和监控工具快速的增加,还是使得人们被大量的数据所困扰. 在数据仓库领域中的许多系统管理员、应用开发者,以及初级数据库管理员发现,他们正在处理“海量数据”-不管你准备与否-都会有好多不熟悉的术语,概念或工具.

数据抽取

- - 数据库 - ITeye博客
转自: http://wiki.mbalib.com/wiki/%E6%95%B0%E6%8D%AE%E6%8A%BD%E5%8F%96#.   数据抽取是指从源数据源系统抽取目的数据源系统需要的. 实际应用中,数据源较多采用的是. 数据迁移或数据复制,它将数据源中的表或视图的数据原封不动的从数 据库中抽取出来,并转换成自己的ETL 工具可以识别的格式.

数据库sharding

- - 数据库 - ITeye博客
当团队决定自行实现sharding的时候,DAO层可能是嵌入sharding逻辑的首选位置,因为在这个层面上,每一个DAO的方法都明确地知道需要访问的数据表以及查询参数,借助这些信息可以直接定位到目标shard上,而不必像框架那样需要对SQL进行解析然后再依据配置的规则进行路由. 另一个优势是不会受ORM框架的制约.

数据脱敏

- - IT瘾-bigdata
作者|李呈祥,其中部分内容由十一城补充. 数据脱敏(Data Masking),又称数据漂白、数据去隐私化或数据变形. 百度百科对数据脱敏的定义为:指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据 的可靠保护. 这样,就可以在开发、测试和其它非生产环境以及外包环境中安全地使用脱敏后的真实数据集.

数据分析之如何用数据?

- - 互联网分析沙龙
光知道怎么看数据,还是不成,你得熟悉这些数据拿到手上之后怎么去用它,怎么让数据显示出来它本身的威力来. 第一个部分,是看历史数据,发现规律. 以社区中的活动和电商中的促销为例,这些都是常见的活动,活动做得好的话有意想不到的效果. 在做这样的活动,最好是拿到前一个月或者两个月的历史数据. 对电商来说,从这里面要去分析各个品类的销售情况,那个品类销量最大,那个品类销量最小,每月或者每周的平均增长率和符合增长率是多少.

excel数据导入mysql数据库

- - 互联网 - ITeye博客
1、excel另存为txt.       选中将要导出的数据列,然后另存为选择其它格式=>文本文件(制表符分割). E:\项目\fblike\game_code_san.txt. 2、txt导入到mysql数据库. load data infile 'E:\\项目\\fblike\\game_code_san.txt' into table game_code_san(code).

数据批量导入Oracle数据库

- - Oracle - 数据库 - ITeye博客
今天学习了一个新的东西,觉得还挺有意思的,也是从别出COPY 的,. SQL*LOADER是大型数据. 仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL). 现在,我们抛开其理论不谈,用实例来使. 您快速掌握SQL*LOADER的使用方法.   首先,我们认识一下SQL*LOADER.

数据分析之如何用数据?

- - 人人都是产品经理
光知道怎么看数据,还是不成,你得熟悉这些数据拿到手上之后怎么去用它,怎么让数据显示出来它本身的威力来. 第一个部分,是看历史数据,发现规律. 以社区中的活动和电商中的促销为例,这些都是常见的活动,活动做得好的话有意想不到的效果. 在做这样的活动,最好是拿到前一个月或者两个月的历史数据. 对电商来说,从这里面要去分析各个品类的销售情况,那个品类销量最大,那个品类销量最小,每月或者每周的平均增长率和符合增长率是多少.

Solr从数据库导入数据

- - CSDN博客互联网推荐文章
一. 数据导入(DataImportHandler-DIH). DIH 是solr 提供的一种针对数据库、xml/HTTP、富文本对象导入到solr 索引库的工具包. apache-solr-dataimportscheduler-1.1.jar(增量导入使用). 数据库对应的jdbc驱动包这里使用的是Oracle oracle10g.ja放入Tomcat6.0.36/webapps/sol/WEB-INF/lib 中.