2 qq 33614100 qq_33614100 于 2016.04.22 17:14 提问

在springmvc中如何在service层切换数据源

我现在的思路是在我的application中配置两个数据库
利用aop自动切换数据库

 <bean id="dataSource" class="com.staples.*.DynamicDataSource">
        <property name="targetDataSources">
            <map key-type="java.lang.String">
                <entry key="dataSourceOne" value-ref=" dataSourceOne " />
                <entry key="dataSourceTwo" value-ref=" dataSourceTwo " />
            </map>
        </property>
        <property name="defaultTargetDataSource" ref=" dataSourceOne " />
    </bean>


<bean id="dataSourceInterceptor" class="com.staples.*. DataSourceInterceptor " />

    <aop:config>
        <aop:aspect id="dataSourceAspect" ref="dataSourceInterceptor">
            <aop:pointcut id="dsOracleOne " expression="execution(* com.controller.生产数据的controller.*.*(..))" />
            <aop:pointcut id="dsOracleTwo" expression="execution(*com.service.日志的service.*.*(..))" />
            <aop:before method="setdataSourceOne" pointcut-ref="dsOracleOne"/>
            <aop:before method="setdataSourceTwo" pointcut-ref=" dsOracleTwo "/>
        </aop:aspect>
    </aop:config>

下面是我的数据库切换方法

 DynamicDataSource.Java

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

public class DynamicDataSource extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        return DatabaseContextHolder.getCustomerType();
    }
}





DataSourceInterceptor.java

import org.aspectj.lang.JoinPoint;

public class DataSourceInterceptor {

    public void setdataSourceMysql(JoinPoint jp) {
        DatabaseContextHolder.setCustomerType("dataSourceOne");
    }

    public void setdataSourceOracle(JoinPoint jp) {
        DatabaseContextHolder.setCustomerType("dataSourceTwo");
    }
}


DatabaseContextHolder.java

public class DatabaseContextHolder {

    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

    public static void setCustomerType(String customerType) {
        contextHolder.set(customerType);
    }

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

    public static void clearCustomerType() {
        contextHolder.remove();
    }
}

请问我可不可以这样写我的aop啊
我是为了实现日志和生产的数据源分离,而我在保存日志的时候都是直接在事务层调我日志的service,这样可以实现吗

7个回答

lcx578176119
lcx578176119   2016.04.22 17:19
已采纳

我给你说个思路吧 你先让一个数据源默认,然后根据请求的信息判断要切换的数据源就行了 你这个配置其实就是按照我说的这样的配置的 是可行的!

liaonanfeng88
liaonanfeng88 这个我有体会;在并发情况下是切换有问题;混乱,导致操作的表使用了其他数据源;异常,表不存在;后端报错;在高并发操作的情况,以上场景不可取;需别考虑,因为sessionFactory是单例;这是事实;想想别的方法吧;
大约一个月之前 回复
qq_33614100
qq_33614100   2016.04.22 17:42

这样说吧我现在要在一个controller中使用两个service,而且两个service是不同的数据源,我现在不知我这种写法可以吗图片说明

lcx578176119
lcx578176119   2016.04.22 17:20
lcx578176119
lcx578176119   2016.04.22 17:20
danielinbiti
danielinbiti   Ds   Rxr 2016.04.22 17:24

controller中不调用services?如果调用,controller设置就没用了

qq_33614100
qq_33614100   2016.04.22 17:25

我现在是要在事务层切换

qq_33614100
qq_33614100   2016.04.27 10:16

经过测试无影响,我的写法可以成立

liaonanfeng88
liaonanfeng88 这个我有体会;在并发情况下是切换有问题;混乱,导致操作的表使用了其他数据源;异常,表不存在;后端报错;在高并发操作的情况,以上场景不可取;需别考虑,因为sessionFactory是单例;这是事实;想想别的方法吧;
大约一个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
spring+mybatis数据源切换【service层以及controller层】
最近项目需要切换数据源,查询了相关资料后做了一个简单的数据源的切换。 一、基本的简单配置 首先是我认为比较好的切换是在service层进行切换,基本思想是利用spring的AbstractRoutingDataSource类进行datasource的选择,就像map一样有个key,value,AbstractRoutingDataSource是有个determineCurrentLookupK
使用spring注解在方法或类上动态切换数据源
1 相关知识 1.1  Spring的AbstractRoutingDataSource抽象类,该类可以充当数据源的路由中介,可以根据名字动态切换数据源 1.2  SpringAop 1.3  Spring自定义注解 2 思路 2.1 在类或方法上添加自定义注解,其值为数据源的名字 2.2 通过SpringAop在项目运行时获取到类或方法上自定义注解的值 2.3 将拿到的注解值
springMVC中多数据源切换的两种主流实现方法(一)
说到多数据源,使用的场景一般有:1,主从数据库切换;2,多租户间数据逻辑隔离;本文后继的例子均以SSM架构为基础讲解,如你的框架不适合,请参考思路即可。最关键的是org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource类。-------------------------------------------------
spring无事务的数据源切换,和带事务的数据源切换
最近在配置spring框架时需要使用多数据源,其中遇到一些问题,特此记录 无事务数据源切换 见 http://blog.csdn.net/shadowsick/article/details/8878448  主要说一下带事务数据源切换的配置 首先在spring-database.xml中配置两个数据源(默认数据源),和应用的切面
在Jsp页面中访问Spring service层处理业务逻辑
<% //省略部分代码 以下是核心代码 if(AlipayNotify.verify(params)){//验证成功 //获得批次号 String batch_no=params.get("batch_no"); //业务处理 ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationCont
SpringMVC容器中Servlet如何调用service层接口
在SpringMVC容器(框架)中Servlet如何调用Service层接口
spring在service层和dao层如何获取request和session
一、在web.xml中添加   org.springframework.web.context.request.RequestContextListener   二、通过代码实现  HttpServletRequest request = ((ServletRequestAttr
springmvc注入service层
使用springmvc采用注解方式注入service: 1.在spring.xml配置文件中注入要扫描的类:    2.service层 接口: public interface TEventsService{ int insertSelective(HttpServletRequest req ,TItmpTcsEvents record); }实现类: @Se
controller或者service层调用配置文件里的属性
配置文件config.properties如下: 我要在controller或者service层里获取UPLOADPATH的属性值 操作步骤如下: 1.在spring的配置文件中写上,如下图 2.在controller层或者service层的成员属性区域写上 @Value("#{configProperties['UPLOADPAT
Java之——SpringMVC+MyBitis+多数据源切换
spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源。oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换。 web.xml webAppRootKey trac org.springframework.web.util.Log4jConfigListener CharacterEnco