博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring AOP 动态切换数据库 (读写库)
阅读量:5308 次
发布时间:2019-06-14

本文共 4488 字,大约阅读时间需要 14 分钟。

      为了减轻数据库的压力,同时也为了提高数据库的效率。我们在开发时都需要配置多个数据库,将 查询等读操作 和 增删改等写操作 分开来。这时候我们就需要对数据库的切换进行一些配置。

     AOP切面很好的实现了动态切换数据源。AbstractRoutingDataSource类是实现的关键,我们需要自己定义一个类继承路由类去实现determineCurrentLookupKey()方法。

1. DynamicDataSource 类

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;public class DynamicDataSource extends AbstractRoutingDataSource{	    @Override    protected Object determineCurrentLookupKey() {    	return  DataBaseContextHolder.getDataSouce();    }    }

 2. 多线程辅助类

package com.common.readwriteseparate;public class  DataBaseContextHolder {        public static final ThreadLocal
contextHolder = new ThreadLocal
(); public static void setDbType(String name) { contextHolder.set(name); } public static String getDataSouce() { return contextHolder.get(); }  public static void clearDBType() {  contextHolder.remove(); }}

 

 3.DataSource 类

import java.lang.annotation.ElementType;  import java.lang.annotation.Retention;  import java.lang.annotation.RetentionPolicy;  import java.lang.annotation.Target;    @Retention(RetentionPolicy.RUNTIME)  @Target(ElementType.METHOD)  public @interface DataSource {      String value();  }

 4. AOP 切面类

public class DataSourceAspect {    //log     private static final Logger logger = Logger.getLogger(DataSourceAspect.class);    public void pointcut(){    }    public void before(JoinPoint point) {        Object target = point.getTarget();        String method = point.getSignature().getName();	logger.debug("当前执行方法" + method);        Class
[] classz = target.getClass().getInterfaces(); //拦截的方法参数类型 Class
[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes(); try { //通过反射获得拦截的方法 Method m = classz[0].getMethod(method, parameterTypes); if (m != null && m.isAnnotationPresent(DataSource.class)) { DataSource data = m.getAnnotation(DataSource.class); DynamicDataSourceHolder.setDbType(data.value()); } } catch (Exception e) { logger.error("数据源失败切面获取异常:", e); } }}

 接下来及时数据源的配置了。

5.我们在spring 的配置文件中对数据库进行配置:

5.1 spring-mybatis.xml(spring + mybatis 配置)

 

MyBatis的数据库持久层配置/配置主-从数据源

 5.2 database.properties

validationQuery=SELECT 1jdbc.initialSize=5jdbc.maxActive=20jdbc.maxWait=60000jdbc.poolPreparedStatements=falsejdbc.poolMaximumIdleConnections=0jdbc.driverClassName=org.gjt.mm.mysql.Drivermaster.jdbc.url=jdbc:mysql://your ip:3306/masterslave.jdbc.url=jdbc:mysql://your ip:3306/slavejdbc.username=usernamejdbc.password=password

 6. 最后,我们需要在业务接口层进行注解来实现对数据库的切换

public interface UserService{              @DataSource("master")      int updateByPrimaryKey(int id);        @DataSource("slave")      User selectByPrimaryKey(int id);  }

 

转载于:https://www.cnblogs.com/yilunzhang/p/7839225.html

你可能感兴趣的文章
vue调试工具之 vue-devtools的安装
查看>>
UCOS2_STM32F1移植详细过程(一)
查看>>
laravel的速查表
查看>>
5-24
查看>>
Javascript一些小细节
查看>>
Struct
查看>>
在WPF程序中使用摄像头兼谈如何使用AForge.NET控件(转)
查看>>
Linux修改用户shell
查看>>
[译]我是怎么构建Node.js程序的
查看>>
suse 源的添加与删除,以及源地址
查看>>
56个 PHP 开发常用代码片段(上)
查看>>
maven安装与项目移植
查看>>
大数据告诉你互联网到底有多大?完全超出你想象!
查看>>
C语言输入日期计算是该年的第几天
查看>>
Caliburn v2 变更-模块化
查看>>
Python之路,Day3 - Python基础3
查看>>
实验 4 在分支循环结构中调用自定义函数
查看>>
Java学习笔记-3.类与对象
查看>>
力扣——车的可用捕货量
查看>>
Redis参数
查看>>