• 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.总结

     

       通过扩展SpringAbstractRoutingDataSource可以很好的实现多数据源的rout效果,而且对扩展更多的数据源有良好的伸缩 性,只要增加数据源和修改DynamicDataSourcetargetDataSources属性配置就好。

    http://www.cnblogs.com/xiaoblog/p/4720160.html

     

     

  • 相关阅读:
    单例类
    日期类2
    日历类
    日期转换类
    抓取网页内容并截图
    关于计时器与多线程
    让页面上图片不变形
    Thread 调用方法的方式
    语音放大缩小
    阻止Enter键回发到服务端Asp.net
  • 原文地址:https://www.cnblogs.com/softidea/p/4720712.html
Copyright © 2020-2023  润新知