• 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的控制方式

     

     @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属性配置就好。

     

     

     

  • 相关阅读:
    【转】Android之四大组件、六大布局、五大存储
    Android O 8.0 奥利奥
    安卓7.1新特性
    那些年我们踩过的坑,SQL 中的空值陷阱!
    8年经验面试官详解 Java 面试秘诀
    Github 第三方授权登录教程
    40个超有趣的Linux命令行彩蛋和游戏
    Synchronized锁在Spring事务管理下,为啥还线程不安全?
    Windows Server 2008 R2文件服务器升级到Windows Server 2016
    牛客练习赛61
  • 原文地址:https://www.cnblogs.com/xiaoblog/p/4720160.html
Copyright © 2020-2023  润新知