`
zhao103804
  • 浏览: 124677 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

spring 配置多数据源过程

 
阅读更多

这里使用AOP拦截注解来切换数据源。
1.    在数据源配置文件context.xml中增加新的数据源信息,使存在多个数据库服务可以访问。注意区别开jndi名称。
2.    在spring配置文件(一般是spring.xml)中增加新数据源的连接配置。
3.    新建多数据源类(比如MultipleDataSource.java),需要继承自org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource
a)    增加静态属性用来保存数据源信息。因为线程间不需要访问对方的数据源,这里使用ThreadLocal保存各线程的数据源信息

public class DataSourceContextLocal
{
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    public static void setDataSourceId(String dataSourceId)
    {
          //增加静态设置方法,用于给当前线程设置数据源
        contextHolder.set(dataSourceId);
    }

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

    public static void clearDataSourceId()
    {
        //增加静态清除方法,用于给无注解方法使用默认数据源
        contextHolder.remove();
    }
}

 

 

 

 b)    重写determineCurrentLookupKey()方法。该方法是spring jdbc用来从targetDataSources中查找数据源的,如果返回为null, 则使用defaultTargetDataSource指定的默认数据源(这些属性在第4步配置)

public class DynamicDataSource extends AbstractRoutingDataSource
{

    @Override
    protected Object determineCurrentLookupKey()
    {
        return DataSourceContextLocal.getDataSourceId();
    }

}

 4.    在spring.xml增加多数据源类的bean

<!-- 多数据源 -->
	<bean id="dynamicDataSource" class="com.iflytek.wh.base.dao.common.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry key="defaultDs" value-ref="defaultDs" />
			</map>
		</property>
		<property name="defaultTargetDataSource" ref="defaultDs" />
	</bean>

 a)    配置属性defaultTargetDataSource,ref值为几个数据库连接中的某一个。当没有指定数据源时,默认使用该连接。
b)    配置属性targetDataSources,map的条目key自由定义,用来识别不同的数据源,value-ref指向对应的数据库连接。
6.    新增注解类,需要包含一个字符串属性,由于结合AOP所以要指定反射期可用,同时该注解作用于方法上:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 用于在dao层切换数据源
 * 
 * @author elsu@iflytek.com
 * @date 2016年3月29日 下午1:04:58
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource
{
    String name() default DataSource.defaultDs;

    public static String defaultDs = "defaultDs";

    public static String otherDs = "otherDs";

    public static String usercenterDs = "usercenterDs";

}

 

 7.    新建一个AOP通知类,我们要在方法执行以前先切换数据源,所以要实现org.springframework.aop.MethodBeforeAdvice接口,重写before(Method method, Object[] args, Object target)方法:

 

import java.lang.reflect.Method;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

import com.iflytek.wh.base.support.annotation.DataSource;

public class DataSourceSwitching implements MethodBeforeAdvice, AfterReturningAdvice {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        String fullMethodName = target.getClass().getSimpleName() + "." + method.getName();
        DataSource dataSource = method.getAnnotation(DataSource.class);
        if (dataSource != null) {
            String dataSourceName = dataSource.name();
            logger.debug(fullMethodName + ":切换到数据源" + dataSourceName);
            DataSourceContextLocal.setDataSourceId(dataSourceName);
        } else {
            logger.debug(fullMethodName + ":使用默认数据源");
            DataSourceContextLocal.clearDataSourceId();
        }
    }

    @Override
    public void afterReturning(Object returnValue, Method method, Object[] args, Object target)
            throws Throwable {
        // DataSourceContextLocal.clearDataSourceId();
    }
}

 

 8.    由于接口实现配置了事务管理,事务的优先级会高于数据源切换。一旦事务开启,再切换数据源是无效的,所以这里需要修改它们的次序
a)    通知类要实现org.springframework.core.Ordered接口,并重写getOrder()方法,令其返回1;

<!-- 事务 -->
	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
		p:dataSource-ref="dynamicDataSource" />
	<tx:annotation-driven transaction-manager="txManager"
		order="1" />

 样,Spring会优先执行通知类方法,之后再开启事务。
9.    在需要切换数据源的接口方法上(必须是接口里的方法,在实现方法上无效)增加注解@BiDSChoicer(dsName="dsname"),属性值必须是配置的targetDataSources属性的条目key。
10.    在spring.xml里面新建通知类的bean,假设id是advice
11.    定义切入点,expression属性要根据情况具体修改,指向实现类

 

<!-- 注解切换数据源 -->
	<aop:config>
		<aop:pointcut id="daoMapping"
			expression="execution(* com.iflytek..service.*.*(..))" />
		<!-- 关键配置,切换数据源一定要比持久层代码更先执行(事务也算持久层代码) -->
		<aop:advisor advice-ref="dataSourceSwitching"
			pointcut-ref="daoMapping" order="0" />
	</aop:config>
	<bean id="dataSourceSwitching" class="com.iflytek.wh.base.dao.common.DataSourceSwitching" />

 这样配置以后,需要修改数据源的接口方法只要在其上增加注解即可。AOP拦截方法后会先对数据源进行设置,有注解的根据注解属性设置,没有注解的设置为使用默认数据源。对于AOP不拦截的则使用默认数据源。

 

 

参考地址:

http://www.cnblogs.com/davidwang456/p/4318303.html

http://somefuture.iteye.com/blog/2306320

分享到:
评论

相关推荐

    spring 动态多数据源配置代码

    - 配置过程中要确保每个数据源都有唯一的标识,以便于路由。 - 注意事务管理的配置,确保在多数据源环境下事务的一致性。 8. **应用场景**: - 分布式系统中,不同的服务可能需要连接不同的数据库。 - 高并发...

    SSM(Spring+SpringMVC+MyBatis)多数据源配置框架

    1. **数据源配置**:在Spring配置文件中,我们需要定义多个数据源bean,每个数据源对应一个数据库连接。这可能包括Druid或HikariCP这样的连接池配置。 2. **动态数据源**:Spring的AbstractRoutingDataSource类允许...

    Spring Boot多数据源(JdbcTemplate)配置与使用

    这个过程的关键在于正确配置数据源,创建并注入相应的`JdbcTemplate` bean,然后在业务逻辑中选择合适的数据源进行操作。在实际开发中,根据项目的具体需求,可能还需要考虑事务管理、数据源切换策略等问题,以实现...

    SpringBoot多数据源配置(方式一:配置多个mapper扫描不同的包路径实现多数据源配置).docx

    本文详细介绍了如何在Spring Boot中配置多数据源,包括创建基础工程、配置数据源、配置MyBatis Plus以及Mapper的扫描。这种方式不仅可以提高系统的灵活性和可扩展性,还能有效地解决跨系统的数据交互问题。希望这些...

    spring整合多数据源完整实例

    在Spring框架中整合多数据源是一项...通过正确配置数据源,动态选择数据源,以及妥善处理事务,我们可以构建起一个高效、灵活的多数据源系统。这个实例提供了一个基础的框架,开发者可以根据自己的需求进行扩展和优化。

    Spring管理配置多个数据源

    这篇博客主要探讨了如何在Spring中配置和管理多个数据源,以便灵活地处理不同的数据库交互需求。 首先,我们要理解Spring的数据源管理。在Spring中,数据源(DataSource)是用于存储和获取数据库连接的对象。通常,...

    Springboot 动态多数据源 jta分布式事务

    2. 配置数据源:创建多个DataSource Bean,每个Bean对应一个数据库连接配置,如URL、用户名、密码等。 3. 注解配置:使用`@Configuration`、`@EnableJpaRepositories`、`@EntityScan`等注解,分别指定数据源、仓库...

    基于Spring多数据源实例

    1. **配置数据源**:在Spring的配置文件中,我们需要定义多个DataSource bean,每个bean对应一个数据源。例如,我们可以创建名为`dataSource1`和`dataSource2`的bean,分别配置它们的连接信息(如URL、用户名、密码...

    ssm实现多数据源配置

    4. **MyBatis配置**:在MyBatis中,需要为每个数据源创建一个SqlSessionFactory,通过`&lt;sqlSessionFactory&gt;`标签配置数据源,并设置Mapper扫描路径。 5. **Service和DAO层**:在Service层,可以通过`@Transactional...

    mybatis spring 多数据源

    // 配置数据源1,如Druid、HikariCP等 } @Bean(name = "dataSource2") public DataSource dataSource2() { // 配置数据源2 } } ``` 接下来,我们可以定义一个动态数据源路由类,使用Spring的AOP来决定在哪个...

    Spring Boot + Druid + Mybatis + Atomikos 配置多数据源 并支持分布式事务

    2. 配置数据源:为每个数据源创建一个DataSource bean,使用Druid的配置类和属性配置不同的数据库连接。 3. 配置事务管理器:使用Atomikos的UserTransactionManager和JtaTransactionManager,注册到Spring Boot的...

    使用注解配置Spring多数据源

    1. **注解配置数据源**: 在Spring 3.0以后版本,可以使用`@Configuration`和`@Bean`注解来声明配置类和bean。对于每个数据源,我们需要创建一个`DataSource`的bean,并用`@Primary`或`@Qualifier`注解来区分它们。...

    spring+hibernate解决多数据源问题3.pdf

    在Spring+Hibernate的整合模式下,通常会在Spring的applicationContext.xml中配置数据源,并通过Spring的IoC容器将数据源注入到SessionFactory中。这样,SessionFactory就可以利用该数据源进行数据库的CRUD操作。 ...

    Spring下mybatis多数据源配置

    1. **配置数据源**:定义数据源对象,用于连接数据库。 2. **事务管理器**:配置事务管理器,以便Spring可以管理事务。 3. **SqlSessionFactory**:创建SqlSessionFactory对象,这是MyBatis的核心工厂类,用于创建...

    mysql和Oracle的多数据源配置demo

    本示例"mysql和Oracle的多数据源配置demo"聚焦于如何在SpringBoot框架下同时集成和管理MySQL与Oracle这两种不同的数据库系统,以实现多数据源的配置。这在需要处理不同数据库类型或者需要实现数据冗余和故障切换的...

    springboot配置多数据源,注解自由切换,完美运行

    本篇文章将详细探讨如何在Spring Boot项目中配置多数据源,并利用注解进行数据源的自由切换,同时也会提及Druid连接池和MyBatis的使用。 首先,我们要理解“多数据源”是什么。多数据源意味着应用程序可以同时连接...

    Spring+SpringMVC+Mybatis动态链接多数据源

    1. **配置数据源**:首先,你需要配置多个数据源,可以使用Spring的AbstractRoutingDataSource作为基础,该类可以根据某种路由策略(如线程本地变量、请求参数等)动态选择数据源。 2. **定义路由逻辑**:创建一个...

    spring配置文件加密实现

    为了保护这些敏感信息不被非法访问或篡改,我们可以对Spring配置文件进行加密处理。本文将深入探讨如何在Java环境中,利用TE网络技术实现Spring配置文件的加密。 首先,我们需要理解Spring配置文件的基本结构。...

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

    在多数据源场景下,SpringBoot允许我们配置多个数据源,这在分布式系统或者数据库分片场景中非常实用。 Atomikos是一个开源的事务管理器,它实现了Java Transaction API (JTA),支持全局事务处理。在分布式系统中,...

    Spring 数据源的灵活配置巧应用

    通过上述步骤,我们可以看到在Spring中配置数据源的过程其实非常简单直观。开发者可以根据实际需求选择合适的数据源实现类,并结合Spring的强大功能,轻松实现高效的数据访问。此外,Spring还支持多种其他的数据源...

Global site tag (gtag.js) - Google Analytics