`
宇宙浪子
  • 浏览: 47755 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Spring多数据源切换

阅读更多

详见 http://www.iteye.com/topic/1125897

 

Applicationcontext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
           http://www.springframework.org/schema/context   
           http://www.springframework.org/schema/context/spring-context-3.0.xsd"
	default-autowire="byName">
	  
	
	<!-- 数据源 -->
	<bean id="parentDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
	 	<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>  
	 	<property name="trace" value="true"/>
	</bean> 
	
	<bean id="sc" parent="parentDataSource">  
        <property name="driverUrl" value="jdbc:oracle:thin:@172.16.6.220:1521:cmes"/>  
        <property name="user" value="meams"/>  
        <property name="password" value="xwcmes"/>  
    </bean>  
      
    <bean id="lz" parent="parentDataSource">  
        <property name="driverUrl" value="jdbc:oracle:thin:@172.16.6.220:1521:cmes"/>  
        <property name="user" value="geams"/>  
        <property name="password" value="geams"/>  
    </bean>  

	<bean id="dataSource" class="com.core.db.DataSources">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry value-ref="sc" key="MINE_01"/>
				<entry value-ref="lz" key="MINE_02"/>
			</map>
		</property>
	</bean>
	
	<!-- 事务  -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
	<!-- 自定义exception处理 -->
	<bean id="exceptionResolver" class="com.core.framework.CommonExceptionHandler"/>
	<!-- 添加Mybatis支持 -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="configLocation" value="classpath:config/ibatis-config.xml"/>
		<!-- 无需配置ibatis-config.xml中的mapper 由spring自动扫描加入 -->
		<property name="mapperLocations" value="classpath:com/dhcc/exchange/ibatis/*.xml"/> 
	</bean>
	
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">  
	        <constructor-arg index="0" ref="sqlSessionFactory" />  
	</bean>  
	
	<!-- 自动将映射接口转换为bean -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer" 
		p:basePackage="com.dhcc.exchange.*.dao" 
		p:sqlSessionFactory-ref="sqlSessionFactory">
	</bean>
	
	<bean id="storageService" class="com.dhcc.exchange.storage.service.StorageService" />
</beans>  

 

 

Ibatis.xml代码

 <?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration PUBLIC 
	"-//mybatis.org//DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
	
<configuration>
	<typeAliases>
		<typeAlias alias="EQUI_STORAGE" type="com.dhcc.exchange.storage.model.Storage" />
	</typeAliases>
</configuration>

 

Storage.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC 
	"-//mybatis.org//DTD Mapper 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.dhcc.exchange.storage.dao.StorageDao">

	<resultMap type="com.dhcc.exchange.storage.model.Storage" id="EQUI_STORAGE_LIST"/>

	<select id="queryStorageList" resultMap="EQUI_STORAGE_LIST" parameterType="EQUI_STORAGE">
		select id,storage_name from t_equi_storage t
	</select>

</mapper>

 

 

Datasourceconstant.java

public class DataSourceConstant {   
    public final static String MINE_01 = "MINE_01";   
    public final static String MINE_02 = "MINE_02";   
}

 

 

Datasources

package com.core.db;</SPAN>   
  
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;   
  
public class DataSources extends AbstractRoutingDataSource {   
    @Override   
    protected Object determineCurrentLookupKey() {   
         return DataSourceSwitch.getDataSourceType();     
    }   
}  

 

 

Datasourceswitch

public class DataSourceSwitch{   
    private static final ThreadLocal<String> contextHolder=new ThreadLocal<String>();   
       
    public static void setDataSourceType(String dataSourceType){   
        contextHolder.set(dataSourceType);   
    }   
       
    public static String getDataSourceType(){   
        return (String) contextHolder.get();   
    }   
       
    public static void clearDataSourceType(){   
        contextHolder.remove();   
    }   
}  

 

 

StorageDao .java

package com.dhcc.exchange.storage.dao;   
  
import com.dhcc.exchange.storage.model.Storage;   
import java.util.List;   
  
public abstract interface StorageDao {   
    public abstract List<Storage> queryStorageList(Storage paramVO);   
}  

 

 

Storageimpl.java

package com.dhcc.exchange.storage.dao.impl;

import java.util.List;

import com.core.framework.BaseDao;
import com.dhcc.exchange.storage.dao.StorageDao;
import com.dhcc.exchange.storage.model.Storage;

public class StorageImpl extends BaseDao implements StorageDao {

	@SuppressWarnings("unchecked")
	@Override
	public List<Storage> queryStorageList(Storage paramVO) {
		return this.getSqlSession().selectList("queryStorageList", paramVO);
	}

}

 

 

Storage .java

package com.dhcc.exchange.storage.model;   
  
public class Storage {   
       
    private String ID;   
    private String storage_name;   
       
    public String getID() {   
        return ID;   
    }   
    public void setID(String ID) {   
        this.ID = ID;   
    }   
       
    public String getStorage_name() {   
        return storage_name;   
    }   
    public void setStorage_name(String storage_name) {   
        this.storage_name = storage_name;   
    }   
}  

 

 

Storageservice.java

public class StorageService extends BaseService {   
  
    @Autowired   
    private StorageDao storageDao;   
    public String getStroage() throws ServiceException{   
        String returnVal = "";   
        try {   
              DataSourceSwitch.setDataSourceType(DataSourceConstant.MINE_01);   
            List<Storage> storages = storageDao.queryStorageList(new Storage());   
            returnVal = binder.toJson(storages);   
            Tracer.trace(returnVal);   
            log.debug("[StorageService.getStroage]JSON IS:"+returnVal);   
        } catch (Exception e) {   
            throw new ServiceException("查询菜单列表失败", e);   
        }   
        return returnVal;   
    }   
}  

 

 

 

分享到:
评论

相关推荐

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

    在本文中,我们将深入探讨如何实现动态数据源切换,支持Spring声明式事务管理,并讨论多数据源回滚策略。以下是对这些知识点的详细说明: 1. **动态数据源切换**: - 通过AspectJ实现数据源的动态切换,可以设置在...

    spring boot数据源切换demo

    在Spring Boot应用中,数据源切换是一个常见的需求,特别是在分布式系统或者微服务架构中,可能需要连接多个数据库来实现不同的业务功能。本示例“spring boot数据源切换demo”将展示如何在Spring Boot中集成MyBatis...

    spring多数据源动态切换方案

    在企业级应用开发中,Spring框架的广泛使用使得...通过这种方式,我们可以灵活地处理复杂的数据源切换场景,适应不同业务的需求。在实际项目中,还需要考虑线程安全、异常处理、测试等方面的问题,确保系统稳定运行。

    基于Spring多数据源实例

    在IT行业中,数据库是系统的核心组成部分,特别是在大型企业级应用中,经常需要处理来自不同来源的数据,这时"多数据源切换"技术就显得尤为重要。本文将深入探讨如何在一个基于Spring框架的应用中实现多数据源的动态...

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

    创建一个自定义的数据源切换注解,比如`@SwitchDataSource`,并在需要切换数据源的方法上使用。通过AspectJ的切面处理,我们可以在方法执行前后动态改变ThreadLocal中的数据源引用。 3. **Spring Cloud Config ...

    spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制

    综上所述,"spring+druid+AtomikosDataSource"的组合为开发者提供了一套强大的工具,用于实现多数据源切换和分布式事务控制。在实际项目中,通过合理的配置和编码,可以构建出高效、健壮的分布式系统。在`mult-table...

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

    本文将深入探讨如何在SpringBoot项目中配置多数据源,并实现数据源的动态切换,帮助你理解和掌握这一核心技能。 首先,我们理解"多数据源"的概念。在SpringBoot应用中,多数据源意味着系统能够连接并操作多个不同的...

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

    通过以上步骤,我们就实现了MyBatis与Spring配合下的动态数据源切换。这种机制有助于在多租户系统、读写分离或者高可用架构中灵活地管理数据库访问,提高了系统的可扩展性和灵活性。在实际应用中,还需要考虑数据源...

    java spring 多数据源

    在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...

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

    具体实现中,需要定义一个Pointcut来指定哪些方法触发数据源切换,以及一个Advice来执行数据源的切换逻辑。 - **动态数据源切换逻辑**:核心逻辑是在AOP切面的Advice中实现。当一个需要切换数据源的方法被调用时,...

    Mybatis+Spring+SpringMVC+quartz多数据源切换

    "Mybatis+Spring+SpringMVC+quartz多数据源切换"的架构设计就是为了满足这样的场景。这个项目结合了四个关键的技术组件,它们分别是Mybatis、Spring、SpringMVC和Quartz,下面将详细介绍这些技术以及它们在多数据源...

    Spring动态切换多数据源Demo

    "Spring动态切换多数据源Demo"是一个示例项目,它展示了如何在Spring中实现灵活的数据源切换。 首先,我们需要了解Spring中的数据源。在Spring中,数据源(DataSource)是Java中定义的javax.sql.DataSource接口的...

    spring多数据源

    Spring多数据源允许我们在一个应用中同时管理多个数据库连接,通过切换不同的数据源来满足不同业务的需求。实现这一功能的关键在于Spring的DataSourceTransactionManager和AbstractRoutingDataSource。 1. **...

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

    在Spring Boot应用中,多数据源的配置与管理是一项重要的任务,特别是在大型系统中,可能需要连接到不同的...在实际项目中,你可能还需要考虑事务管理、数据源切换的异常处理等问题,确保整个系统的稳定性和一致性。

    Spring多数据源分布式事务管理

    在Spring中,我们可以通过DataSourceProxy和AbstractRoutingDataSource来实现多数据源的切换。DataSourceProxy是Spring的一个代理类,它可以对数据源进行包装,以便在执行SQL语句前决定使用哪个数据源。...

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

    - AOP切面的Java类,实现了方法执行前后的拦截和数据源切换。 - 数据源相关的Java配置类,用于配置Spring的DataSource和MybatisPlus。 - Mapper接口和对应的XML文件,定义数据库操作。 - 业务逻辑层的Java类,其中的...

    spring-boot集成mybtis+druid实现hive/mysql多数据源切换

    本文将详细讨论如何使用Spring Boot、MyBatis和Druid来实现MySQL与Hive之间的多数据源切换,以满足不同业务场景的需求。 首先,Spring Boot是Spring框架的一种轻量级实现,它简化了配置并提供了快速开发新应用的...

    spring boot动态切换多数据源

    - 可以编写单元测试或集成测试,模拟不同场景下的数据源切换,确保功能正确无误。 - 使用日志记录数据源切换的过程,以便于调试和监控。 8. **最佳实践** - 避免在业务代码中直接切换数据源,最好通过服务层的...

    spring 动态切换数据源

    - 在生产环境中,需要确保数据源切换的正确性,可以使用监控工具(如Spring Actuator)跟踪数据源切换情况,同时编写单元测试和集成测试确保功能正常。 综上所述,Spring动态切换数据源是通过配置不同数据源,结合...

    springboot实现多数据源而且加上事务不会使aop切换数据源失效

    本示例主要讲解如何使用Spring Boot结合MyBatis实现多数据源切换,并确保AOP事务管理仍然有效。 首先,我们需要配置多数据源。在Spring Boot中,可以使用`DataSource`接口的实现类,如`HikariCP`或`Druid`,创建两...

Global site tag (gtag.js) - Google Analytics