spring使用aop进行读写分离
来源:互联网 发布:五十音图软件 编辑:程序博客网 时间:2024/05/16 14:14
前提:已成功搭建MySQL主从集群。
mysql主从复制环境搭建
原理:首先使用spring配置动态数据源,然后使用切面拦截service方法,判断执行的是写操作还是读操作,以此来动态的修改此次请求所使用的数据源。
spring配置文件:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
数据库连接信息:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
aop切面:
DataSourceAspect.Java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
如果想用注解方式区分主从库,可以用一下方式:
public void before(JoinPoint point) {System.out.println("aop before进来了...");// 获取到当前执行的方法名String methodName = point.getSignature().getName();Class clazz = point.getSignature().getDeclaringType();System.out.println("methodName:" + methodName);System.out.println("clazz:" + clazz);try {if (isSlave(point)) {System.out.println("slaver");// 标记为从库DBContextHolder.setDBType(DBContextHolder.DATA_SOURCE_SLAVER);} else {System.out.println("master");// 标记为主库DBContextHolder.setDBType(DBContextHolder.DATA_SOURCE_MASTER);}} catch (NoSuchMethodException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SecurityException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 判断是否为读库 * * @param methodName * @return * @throws SecurityException * @throws NoSuchMethodException */private Boolean isSlave(JoinPoint point) throws NoSuchMethodException, SecurityException {// 方法名以query、find、get开头的方法名走从库// return StringUtils.startsWithAny(methodName, "query", "find", "get");Object target = point.getTarget();String method = point.getSignature().getName();Class<?>[] classz = target.getClass().getInterfaces();Class<?>[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();Method m = classz[0].getMethod(method, parameterTypes);if (m != null && m.getAnnotation(Master.class) != null) {return false;}if (m != null && m.getAnnotation(Slaver.class) != null) {return true;}return false;}
DBContextHolder.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
DynamicDataSource.java
0 0
- spring使用aop进行读写分离
- spring aop 实现读写分离
- spring aop实现读写分离:
- 使用spring aop实现业务层mysql 读写分离
- 使用Spring AOP切面解决数据库读写分离
- 使用Spring AOP切面解决数据库读写分离
- 使用spring aop实现业务层mysql 读写分离
- 使用Spring AOP实现MySQL数据库读写分离案例分析
- 使用Spring AOP实现MySQL数据库读写分离案例分析
- 使用Spring AOP实现MySQL数据库读写分离案例分析
- 使用Spring AOP实现MySQL数据库读写分离案例分析
- 使用Spring AOP切面解决数据库读写分离
- 使用Spring AOP实现MySQL数据库读写分离案例分析
- 【spring】spring AOP实现mysql读写分离
- Spring AOP 实现主从读写分离
- spring AOP多数据源读写分离
- 基于Spring AOP方式的读写分离
- 使用Spring实现读写分离
- 剑指offer-面试题28-字符串的排列
- Android填坑之旅(第七篇)Android中解决ImageView长宽比例不一导致填充缩放失真
- VS2013 舒服的字体设置和背景色
- php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
- 项目中向mysql数据库做更新操作报错
- spring使用aop进行读写分离
- Over ? Fighting !
- 设置缓存的大小
- JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
- Prometheus 实战于源码分析之部署
- Error:(896) Apostrophe not preceded by \
- httpURLConnection post请求 然后使用Gson转换成想要的class
- Java并发编程:并发容器之CopyOnWriteArrayList(转载)
- HDU-5792