spring多数据源的配置(转)
C3P0和DBCP的区别
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
dbcp简介:
DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
c3p0与dbcp区别:
dbcp没有自动的去回收空闲连接的功能 c3p0有自动回收空闲连接功能
两者主要是对数据连接的处理方式不同!C3P0提供最大空闲时间,DBCP提供最大连接数。
前者当连接超过最大空闲连接时间时,当前连接就会被断掉。DBCP当连接数超过最大连接数时,所有连接都会被断开
1、首先配置多个datasource

- <!-- 主数据库的数据据源 -->
- <bean id="masterDataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
- <property name="url" value="jdbc:oracle:thin:@192.168.10.11:1521:trew" />
- <property name="username" value="poi" />
- <property name="password" value="poi" />
- </bean>
- <!-- 备份库的数据据源 -->
- <bean id="slaveDataSource" class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
- <property name="url" value="jdbc:oracle:thin:@192.168.10.12:1521:trew" />
- <property name="username" value="poi2" />
- <property name="password" value="poi2" />
- </bean>

2、写一个DynamicDataSource类继承AbstractRoutingDataSource,并实现determineCurrentLookupKey方法
public class DynamicDataSource extends AbstractRoutingDataSource { @SuppressWarnings ( "unused" ) private Log logger = LogFactory.getLog(getClass()); @Override protected Object determineCurrentLookupKey() { return DbContextHolder.getDbType(); } } public class DbContextHolder { @SuppressWarnings ( "rawtypes" ) private static final ThreadLocal contextHolder = new ThreadLocal(); @SuppressWarnings ( "unchecked" ) public static void setDbType(String dbType) { contextHolder.set(dbType); } public static String getDbType() { return (String) contextHolder.get(); } public static void clearDbType() { contextHolder.remove(); } } |
3. 配置动态数据源

- <!--将DynamicDataSource Bean加入到Spring的上下文xml配置文件中去,同时配置DynamicDataSource的targetDataSources(多数据源目标)属性的Map映射。-->
- <bean id="dataSource" class="cn.com.core.datasource.DynamicDataSource">
- <property name="targetDataSources">
- <map key-type="java.lang.String">
- <entry key="masterDataSource" value-ref="masterDataSource" />
- <entry key="slaveDataSource" value-ref="slaveDataSource" />
- </map>
- </property>
- <property name="defaultTargetDataSource" ref="masterDataSource"/>
- </bean>

4.使用动态数据源(hibernate)

- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource" />
- <property name="lobHandler" ref="lobHandler"/>
- <property name="eventListeners">
- <map>
- <entry key="post-insert">
- <ref bean="logListener"/>
- </entry>
- <entry key="post-update">
- <ref bean="logListener"/>
- </entry>
- <entry key="post-delete">
- <ref bean="logListener"/>
- </entry>
- </map>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.Oracle10gDialect
- <!-- org.hibernate.dialect.OracleDerbyDialect -->
- </prop>
- <prop key="hibernate.show_sql">true</prop>
- <!-- <prop key="hibernate.generate_statistics">true</prop> -->
- <prop key="hibernate.connection.release_mode">
- auto
- </prop>
- <prop key="hibernate.autoReconnect">true</prop>
- <!--
- <prop key="hibernate.hbm2ddl.auto">update</prop>
- -->
- <prop key="hibernate.cache.use_second_level_cache">false</prop>
- <prop key="hibernate.cache.provider_class">
- org.hibernate.cache.EhCacheProvider
- </prop>
- <prop key="hibernate.cache.use_query_cache">false</prop>
- </props>
- </property>
- </bean>

使用Hibernate时的事务管理配置示例:
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- < property name="sessionFactory" ref="sessionFactory" />
- bean>
6.动态数据源的管理控制
1.可以根据不同的DAO注入目标sessionfactory

- <bean id="demoDao"
- class="cn.com.dao.impl.demoDaoImpl">
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
- <bean id="demoDao1"
- class="cn.com.dao.impl.demoDao1Impl">
- <property name="sessionFactory" ref="sessionFactory1"/>
- </bean>

2.可以采用代码手动控制
- DBContextHolder.setCustomerType(DBContextHolder.masterDataSource);
- DBContextHolder.setCustomerType(DBContextHolder.slaveDataSource);
3.可以采用AOP的控制方式
1
2
3
4
5
6
7
8
9
10
11
12
13
|
@Aspect public class DynamicDataSourceAspect { @Pointcut ( "execution (public service.impl..*.*(..))" ) public void serviceExecution(){} @Before ( "serviceExecution()" ) public void setDynamicDataSource(JoinPoint jp) { for (Object o : jp.getArgs()) { //处理具体的逻辑 ,根据具体的境况 DBContextHolder.setCustomerType()选取DataSource } } } |
7.总结
通过扩展Spring的AbstractRoutingDataSource可以很好的实现多数据源的rout效果,而且对扩展更多的数据源有良好的伸缩 性,只要增加数据源和修改DynamicDataSource的targetDataSources属性配置就好。
http://www.cnblogs.com/xiaoblog/p/4720160.html
spring多数据源的配置(转)的更多相关文章
- Spring多数据源的配置和使用
1. 配置多个数据源 最近开发一个数据同步的小功能,需要从A主机的Oracle数据库中把数据同步到B主机的Oracle库中.当然能够用dmp脚本或者SQL脚本是最好,但是对于两边异构的表结构来说,直接 ...
- spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式
spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...
- Spring动态数据源的配置
Spring动态数据源 我们很多项目中业务都需要涉及到多个数据源,就是对不同的方法或者不同的包使用不同的数据源.最简单的做法就是直接在Java代码里面lookup需要的数据源,但是这种做法耦合性太高, ...
- Spring boot 数据源未配置异常
问题 在使Springboot自动生成的项目框架时如果选择了数据源,比如选择了mysql,生成项目之后,启动会报一下异常: Description: Cannot determine embedded ...
- 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转
在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...
- spring多数据源的配置
C3P0和DBCP的区别 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. d ...
- spring多数据源事务配置
项目中遇到多数据源问题, 对于每个数据源需要单独完成事务控制, 这里记录下具体实现方法 在spring配置文件中 定义两个数据源 <!-- 数据源定义(spring-jndi) --> ...
- spring的数据源基本配置
aplictaionContext-dataSource的配置: <?xml version="1.0" encoding="utf-8"?> &l ...
- 基于注解的Spring多数据源配置和使用
前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备.由于之前做过的项目都是单数据源的,没有遇到这种场景,所以也一直没有去了解过如何配置多 ...
随机推荐
- IOS开发笔记 - 基于wsdl2objc调用webservice
为了方便在ios下调用webserivce,找来了wsdl2objc这样一个开源的框架来解析webservice方便在ios下引用. 下面做个小例子. 1.首先是用Asp.net搭建一个测试的webs ...
- 一个带动画的页面底部的TabBar的实现
有时有这样一个需求,页面底部有几个图标能够点击,假设一个screenWidth显示不下这些图标,则这一列图标最后一个是more,点击more,能够通过动画展示两列图标 这样来增加layout中: &l ...
- HibernateReview Day1 - Introduction
Hibernate已经学过去大概有半个月了,然后默默的忘掉了……所谓Practice makes perfect. 我尽力重新拾起来. 1.什么是ORM 在介绍Hibernate之前,我们先学习下OR ...
- Objective-C类的使用
Objective-C教程的例题: // // main.m // test // // Created by liwei on 14-10-28. // Copyright (c) 2014年 li ...
- struts2 Session拦截器
一:struts2简介 二:拦截器
- ORA-00020的思考
今天,历史的图书馆例行检查DB,发现alert.log有一"ORA-00020: maximum number of processes (150) exceeded",这是一个常 ...
- Solr入门指南
本文转自http://chuanliang2007.spaces.live.com/blog/cns!E5B7AB2851A4C9D2!499.entry?wa=wsignin1.0 因为搜索引擎功能 ...
- python基础课程_学习笔记15:标准库:有些收藏夹——fileinput
标准库:有些收藏夹 fileinput 重要功能 性能 叙述性说明 input([files[,inplace[,backup]]) 便于遍历多个输入流中的行 filename() 返回当前文件的名称 ...
- UVA11100- The Trip, 2007
option=com_onlinejudge&Itemid=8&category=512&page=show_problem&problem=2041"> ...
- CentOS6.5 Nginx优化编译配置
说到Nginx,它真的算是我在运维工作中的好朋友,它优异的性能和极高的工作效率实在是让人大爱,来自internet的报告称其epoll模型能够支持高达50000个并发连接数. Epoll[维基百科]: ...