`
fxiaozj
  • 浏览: 55856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring动态切换数据源

 
阅读更多
spring配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns:aop="http://www.springframework.org/schema/aop"
	   xmlns:tx="http://www.springframework.org/schema/tx"
	   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
	   default-autowire="byName" default-lazy-init="true">
	   
	<!-- Local DataSource that works in any environment -->
	<bean id="syjdataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
        <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
        <property name="testConnectionOnCheckin" value="${c3p0.testConnectionOnCheckin}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
        <property name="acquireRetryDelay" value="${c3p0.acquireRetryDelay}"/>
        <property name="breakAfterAcquireFailure" value="${c3p0.breakAfterAcquireFailure}"/>
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
        <property name="automaticTestTable" value="${c3p0.automaticTestTable}"/>
	</bean>	
	
	<!-- Local DataSource that works in any environment -->
	<bean id="dutydataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${duty.jdbc.username}"/>
        <property name="password" value="${duty.jdbc.password}"/>
        <property name="minPoolSize" value="${duty.c3p0.minPoolSize}"/>
        <property name="maxPoolSize" value="${duty.c3p0.maxPoolSize}"/>
        <property name="initialPoolSize" value="${duty.c3p0.initialPoolSize}"/>
        <property name="maxIdleTime" value="${duty.c3p0.maxIdleTime}"/>
        <property name="acquireIncrement" value="${duty.c3p0.acquireIncrement}"/>
        <property name="testConnectionOnCheckin" value="${duty.c3p0.testConnectionOnCheckin}"/>
        <property name="acquireRetryAttempts" value="${duty.c3p0.acquireRetryAttempts}"/>
        <property name="acquireRetryDelay" value="${duty.c3p0.acquireRetryDelay}"/>
        <property name="breakAfterAcquireFailure" value="${duty.c3p0.breakAfterAcquireFailure}"/>
        <property name="idleConnectionTestPeriod" value="${duty.c3p0.idleConnectionTestPeriod}"/>
        <property name="automaticTestTable" value="${duty.c3p0.automaticTestTable}"/>
	</bean>	
	
	<!-- 动态切换数据源 -->
	<bean class="com.harmony.datasource.DynamicDataSource" id="dataSource">
       <property name="targetDataSources">
		     <map key-type="java.lang.String">
	            <entry value-ref="syjdataSource" key="syjbs_event"></entry>
	           <entry value-ref="dutydataSource" key="syjbs_duty"></entry>
	         </map>
  		</property>
  	<!-- 设置数据源默认启动项-->
 	<property name="defaultTargetDataSource" ref="syjdataSource"></property>
 </bean>
 
 
	<!--Hibernate TransactionManager-->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!--事务代理,如果service需要事务,从此处继承Base TransactionProxyed Service Bean-->
    <bean id="baseTxService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="transactionAttributes">
            <props>
           
                <prop key="insert*">PROPAGATION_REQUIRED</prop>
                <prop key="save*">PROPAGATION_REQUIRED</prop>
                <prop key="update*">PROPAGATION_REQUIRED</prop>
                <prop key="remove*">PROPAGATION_REQUIRED</prop>
				<prop key="edit*">PROPAGATION_REQUIRED</prop>                            
                <prop key="add*">PROPAGATION_REQUIRED</prop>                              
                <prop key="del*">PROPAGATION_REQUIRED</prop>                                              
            </props>
        </property>
    </bean>     
	
	<bean id="JdbcDAOUtil"
		class="com.harmony.framework.dao.impl.JdbcDAOImpl">
		<property name="dataSource">
			<ref local="dataSource"/>
		</property>
	</bean>
	<!-- 定义lobHandler -->
	<bean id="lobHandler" lazy-init="true"   class="org.springframework.jdbc.support.lob.OracleLobHandler">
        <property name="nativeJdbcExtractor">
            <ref bean="nativeJdbcExtractor"/>
        </property>
	</bean> 

	<bean id="nativeJdbcExtractor" lazy-init="true" class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"/>
	<!--  Session Factory set -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref local="dataSource"/>
		</property>
		<property name="lobHandler" ref="lobHandler"/>
	    <!-- 建议模块的hbm文件统一放置,此处添加模块的类路径,如:<value>classpath:/com/harmony/模块名称/domain/hbm/</value> -->
		<property name="mappingDirectoryLocations">
			<list>	
			   <value>classpath:/com/harmony/domain/hbm/</value>
			   <value>classpath:/com/harmony/duty/domain/hbm/</value>
			</list>
		</property>

	<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</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="query.substitutions">true 1, false 0,  yes '1', no '1'</prop>
				
				<!--oracle 数据库必须添加上,否则内存越来越大,反应越来越慢!-->
				<prop key="hibernate.jdbc.fetch_size">50</prop>
				<prop key="hibernate.jdbc.batch_size">25</prop>
				<prop key="hibernate.jdbc.use_scrollable_resultset">true</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
				
				<!--<prop key="hibernate.transaction.factory_class">net.sf.hibernate.transaction.JTATransactionFactory</prop>-->
				<!-- configure for WebLogic
				<prop key="jta.UserTransaction">javax/transaction/UserTransaction</prop>
            	<prop key="hibernate.transaction.manager_lookup_class">net.sf.hibernate.transaction.WeblogicTransactionManagerLookup</prop>
                -->
				<!-- configure for WebSphere -->
				<!--<prop key="jta.UserTransaction">${jta.userTransaction}</prop>
				<prop key="hibernate.transaction.manager_lookup_class">${hibernate.transaction.manager_lookup_class}</prop>-->
			</props>
		</property>
	</bean>	

	<bean id="hibernateTemplateInterceptor" class="com.harmony.framework.dbaccesslog.service.hibernate.HibernateTemplateInterceptor">
		<property name="logEnable">
			<value>false</value>
		</property>
	</bean>	
	
	<bean id="hibernateTemplateTarget" class="org.springframework.orm.hibernate3.HibernateTemplate" >
		<constructor-arg>
			<ref local="sessionFactory"/>
		</constructor-arg>
	</bean>	

	<bean id="hibernateTemplate" class="org.springframework.aop.framework.ProxyFactoryBean">
	    <property name="proxyTargetClass" value="true"/>
	    <property name="target">
	      <ref local="hibernateTemplateTarget"/>
	    </property>
		<property name="interceptorNames">
			<list>
				<value>hibernateTemplateInterceptor</value>
			</list>
		</property>
	</bean>
</beans>

后台引用,在增删改查的时候要指定数据源方式:
/**
	 * 根据指定的条件重置发送失败的数据,可以实现继续发送。
	 *
	 */
	public void updateReset() throws Exception {
		CustomerContextHolder.setCustomerType(Constants.EVENT_SYJBS_DATASOURCE);
		.......
	}

引用的类:
package com.harmony.datasource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

	protected Object determineCurrentLookupKey() {

		return CustomerContextHolder.getCustomerType();

	}

}

package com.harmony.datasource;

import org.springframework.util.Assert;

public class CustomerContextHolder {

	@SuppressWarnings("unchecked")
	private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

	@SuppressWarnings("unchecked")
	public static void setCustomerType(String customerType) {
		Assert.notNull(customerType, "customerType cannot be null");
		contextHolder.set(customerType);
	}

	public static String getCustomerType() {
		return (String) contextHolder.get();
	}

	public static void clearCustomerType() {
		contextHolder.remove();
	}
}
1
0
分享到:
评论

相关推荐

    spring 动态切换数据源

    在Spring框架中,动态切换数据源是一项重要的功能,它允许应用程序根据业务需求在多个数据库之间灵活切换。这一特性对于多租户系统、读写分离、分布式数据库等场景尤其有用。以下将详细介绍如何实现Spring的动态数据...

    spring动态切换数据源

    在Java的Spring框架中,动态切换数据源是一项重要的功能,尤其在多租户、微服务或者需要根据业务逻辑切换数据库的场景下。本知识点主要围绕如何在Spring中实现数据源的动态切换进行深入探讨。 首先,我们需要理解...

    Spring 动态切换数据源

    【Spring 动态切换数据源】是一种在Spring框架中实现的应用程序能够在运行时根据需求动态选择数据源的技术。这种功能对于多数据库环境或者需要对不同数据源执行操作的系统非常有用,例如数据聚合、报表生成等场景。 ...

    真正意义的spring动态切换数据源源码

    本文将深入探讨“真正意义的Spring动态切换数据源”这一主题,并结合源码进行分析。 动态数据源切换是在多数据库环境下的常见需求,例如在测试和生产环境中使用不同的数据库,或者在微服务架构中,每个服务可能需要...

    mybatis+spring实现动态切换数据源

    在本项目中,我们将探讨如何利用MyBatis与Spring框架实现动态切换数据源的功能。首先,我们需要理解MyBatis和Spring的基本概念以及它们如何协同工作。 MyBatis是一个优秀的持久层框架,它简化了Java与数据库之间的...

    Spring动态切换多数据源Demo

    此外,为了在代码中切换数据源,通常会有一个数据源路由的策略,例如在Service层根据业务逻辑决定使用哪个数据源。这可能涉及到AOP(面向切面编程)的使用,通过注解或配置来切换数据源。 在实际开发中,多数据源的...

    Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源

    本项目“Spring+SpringMvc+MybatisPlus+Aop(自定义注解)动态切换数据源”正是针对这一需求提供的一种解决方案。下面将详细介绍这个项目中的关键技术点和实现原理。 首先,Spring框架是Java企业级应用开发的核心...

    SpringBoot配置多数据源实现动态切换数据源

    接下来是动态切换数据源的关键,这通常通过AOP(面向切面编程)和ThreadLocal来实现。创建一个自定义的`Aspect`,并在方法执行前根据业务逻辑选择合适的数据源: ```java @Aspect @Component public class ...

    springboot-AOP实现多数据源动态切换(Druid连接池)

    在Spring Boot项目中实现多数据源动态切换是一项高级特性,能够使应用根据不同业务需求访问不同的数据库,从而实现服务的解耦和数据库操作的优化。该技术的关键在于如何在同一个应用中配置和使用多个数据源,以及...

    Springcloud 多数库 多数据源整合,查询动态切换数据库

    2. **动态切换数据源**:在Spring框架中,我们可以利用AOP(面向切面编程)和ThreadLocal来实现数据源的动态切换。创建一个自定义的数据源切换注解,比如`@SwitchDataSource`,并在需要切换数据源的方法上使用。通过...

    spring boot动态切换多数据源

    动态切换数据源意味着程序可以根据运行时的需求,灵活地选择要使用的数据源。这对于处理复杂业务逻辑和优化系统性能至关重要。例如,读操作可能指向一个只读的数据源,而写操作则连接到主数据库。 4. **实现方式**...

    Spring Boot多数据源(支持Spring声明式事务切换和回滚).pdf

    5. **事务内切换数据源**: - 引入了一个创新的特性,即在同一个事务内支持数据源的切换,并且兼容Spring的声明式事务管理。这意味着在事务中,可以按需在不同的数据源之间平滑切换,而无需担心事务一致性问题。 6...

    spring boot多数据源(AOP注解动态切换)

    通过以上步骤,我们成功地在Spring Boot中实现了基于AOP注解的多数据源动态切换。这使得在运行时可以根据业务需求选择合适的数据源,提高了代码的灵活性和可维护性。在实际项目中,你可能还需要考虑事务管理、数据源...

    SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式

    本主题将深入探讨如何利用SpringBoot结合Atomikos实现动态多数据源以及事务管理,并介绍两种切换数据源的方法。 首先,SpringBoot简化了传统Spring应用的初始化过程,它通过自动配置和starter包让开发者快速搭建...

    Spring(AbstractRoutingDataSource)实现动态数据源切换示例

    【Spring 动态数据源切换】使用 `AbstractRoutingDataSource` 的详细实现在处理多数据库环境时,Spring 提供了一个强大的工具 `AbstractRoutingDataSource`,它允许我们根据特定条件动态地切换数据源。本文将深入...

    ssm动态切换数据源

    本文将深入探讨如何在基于SSM(Spring、Spring MVC、MyBatis)的项目中实现“动态切换数据源”,这是一个在多数据库环境下非常重要的功能。 首先,我们来理解“动态切换数据源”的概念。在大型应用中,通常会根据...

    spring mybatis 多数据源动态切换

    Spring 和 MyBatis 结合使用时,实现多数据源动态切换是一项重要的技术。本文将深入探讨如何在 Spring 中配置和管理多个数据源,并实现动态切换。 首先,我们需要理解“多数据源”是什么。它是指在一个应用中同时...

    Spring MVC 切换数据源

    本文将深入探讨如何在Spring MVC中实现数据源的动态切换,以及如何与MySQL数据库协同工作,同时利用MyEclipse作为开发环境。 首先,我们需要理解Spring MVC中的数据源(DataSource)是应用程序连接到数据库的桥梁。...

    spring动态选择数据源

    本篇文章将探讨“Spring动态选择数据源”这一主题,它允许我们的应用程序根据业务需求在多个数据源之间灵活切换,这在多租户、读写分离等场景下尤其重要。 首先,理解“数据源”在Spring中的概念。数据源...

    mybatis+spring实现动态切换数据源 maven项目

    mybatis+spring实现动态切换数据源,修改数据源配置信息之后,直接运行test可进行测试 maven项目 导入即可 jar包都不用 适合学习参考 出自Java自学网 (Java自学网专供 就是免积分下载)

Global site tag (gtag.js) - Google Analytics