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

 

 

时间: 2024-12-11 10:34:45

spring多数据源的配置(转)的相关文章

配置Spring的数据源

不管通过何种持久化技术,都必须通过数据连接访问数据库,在Spring中,数据连接是通过数据源获得的.在以往的应用中,数据源一般是Web应用服务器提供的.在Spring中,你不但可以通过JNDI获取应用服务器的数据源,也可以直接在Spring容器中配置数据源,此外,你还可以通过代码的方式创建一个数据源,以便进行无依赖的单元测试. 配置一个数据源 Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0.可以在Spring配置文件中利用这两者中任何一个配

Spring MVC 多数据源,配置完事务之后就不能正常切换数据源,求大神指点

问题描述 Spring MVC 多数据源,配置完事务之后就不能正常切换数据源,求大神指点 两张附图事务没配置的时候数据源切换正常,加上事务之后就一直显示的是默认连接的数据源, 这是为什么啊??百思不得其解,,求神哥神姐解惑啊 这个是数据源切换代码 切换的时候就是 每次在掉底层方法之前先设置下数据库 向下面这样 MultipleDataSource.setDataSourceKey("yz_dataSource"); MultipleDataSource.setDataSourceKey

【JAVA秒会技术之随意切换数据库】Spring如何高效的配置多套数据源

 Spring如何高效的配置多套数据源     真正的开发中,难免要使用多个数据库,进行不同的切换.无论是为了实现"读写分离"也好,还是为了使用不同的数据库("MySQL"或"Oracle"或"SQLServer").传统的方法,是配置多套Spring配置文件与Mysql配置文件,不仅配置起来较为混乱,而且切换及对事物的管理,也很麻烦.下面,博主就介绍一种方法,帮助大家解决"Spring如何高效的配置多套数据源&qu

Spring多数据源分布式事务管理/springmvc+spring+atomikos[jta]+druid+mybatis

项目进行读写分离及分库分表,在一个业务中,在一个事务中处理时候将切换多个数据源,需要保证同一事务多个数据源数据的一致性.此处使用atomikos来实现:最后附源码: 1:spring3.0之后不再支持jtom[jta]了,第三方开源软件atomikos(http://www.atomikos.com/)来实现.  2:org.springframework.transaction.jta.JotmFactoryBean类,spring-tx-2.5.6.jar中有此类,spring-tx-3.0

ssh 多数据源问题!-spring多数据源动态切换问题

问题描述 spring多数据源动态切换问题 一个总公司托管了N个子公司,每个子公司对应自己的数据库,我的程序实现每个子公司根据用户名登录的时候,只访问自己的数据库,而且公司的数目还在增加,这就涉及到了动态切换多数据源的问题!,还涉及到多个用户登录的时候的并发问题!急求解决,谢谢! 解决方案 目前很多项目中只能配置单个数据源,那么如果有多个数据源肿么办?Spring提供了一个抽象类AbstractRoutingDataSource,为我们很方便的解决了这个问题.1.写一个DynamicDataSo

Spring 多数据源事务配置问题

在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难.最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难搞.在上一篇中,我探讨了SpringSide 3 中的数据访问层,在这一篇中,我立志要解决多数据源配置的难题,我的思路是这样的: 第一步.测试能否配置多个DataSource第二步.测试能否配置多个SessionFactory第三步.测试能否配置多个TransactionManager第四步.测试能否使用多个Transa

在spring的配置文件中配置c3p0和在hibernate的配置文件中配置c3p0有什么区别?

问题描述 在spring的配置文件中配置c3p0和在hibernate的配置文件中配置c3p0有什么区别? 在spring的配置文件中配置c3p0和在hibernate的配置文件中配置c3p0有什么区别? 我最近在学习如何配置struts2+spring+hibernate,其中数据库连接池使用c3p0,一开始在hibernate.cfg.xml中添加c3p0连接的信息如下: <property name="hibernate.connection.provider_class"

spring 多数据源 ,mybatis和hibernet版本

mybatis版本 1.数据源配置: jdbc_multiple.properties: # MySQL #============================================================================ jdbc.mysql.driver=com.mysql.jdbc.Driver jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncodi

Grails项目数据源的配置

网上有很多关于Grails项目数据源的配置的文档,但好多文档将的都是Grails1.X之前的配置,而对于Grails1.X项目数据源的配置绝大多数语焉不详:Grails官方文档也对这个内容一笔带过. 打开网上任何一个有关Grails1数据源配置的文档,都会告诉我们,有关数据源的配置在Grails项目的grails-app/config目录下的DataSource.groovy文件里. 默认的配置为: dataSource { pooled = false driverClassName = "o