- 浏览: 198926 次
- 性别:
- 来自: 哈尔滨
文章分类
- 全部博客 (267)
- java.lang (8)
- 问题汇总 (21)
- 异常记录 (20)
- 功能实现 (19)
- 面试总结 (25)
- 技巧总结 (8)
- 常用代码 (4)
- 编程习惯 (3)
- 编码规则 (3)
- java.util (10)
- java.io (1)
- JavaWeb (9)
- MySQL (16)
- SVN (3)
- MyBatis (11)
- Velocity (7)
- 其他知识 (10)
- 人生哲理 (1)
- 人生故事 (1)
- 自我感悟 (1)
- shiro (3)
- 基础知识 (0)
- 问题总结 (1)
- Spring 标签 (1)
- Spring (3)
- 点滴生活 (1)
- DOS (1)
- CAS (4)
- Linux (9)
- Storm (6)
- Shell (1)
- regex (1)
- Collection (4)
- poi (1)
- 经典语句 (1)
- NIO (5)
- concurrent (14)
- RPC (1)
- zookeeper (3)
- 待整理 (2)
- Hadoop (9)
- RabbitMq (2)
- flume (1)
- hive (7)
- hbase (4)
- kafka (1)
- scala (1)
- GC (0)
- java.util.concurrent.atomic (1)
- java.lang.ref (6)
- JVM (2)
- algorithm (1)
- conception (1)
- java key word (1)
- sun.misc (1)
最新评论
基于AbstractDataSource实现主从数据库切换
项目背景:
1.DBA通知某一个SQL运行严重超时,告知将读取源头从主库改为从库,减轻主库压力
2.数据库配置上有两个数据源,主从两个配置;
主库:允许读写;从库:只允许读;
主从库数据同步
3.功能已存在,分析运行流程如下
项目流程:
一、使用自定义注释
@RequestMapping(value="/getBrandHisProjectsForM",method=RequestMethod.POST) @ResponseBody @DbReadonly public Response<BrandHisProjectRes> getBrandHisProjectsForM(@RequestBody BrandHisProjectReq brandHisProjectReq){ return getBrandHisProjects(brandHisProjectReq.getBrandId(), brandHisProjectReq.getCpage(), brandHisProjectReq.getPageSize(), ConstantAction.PLATFORM.M); }
1.在Service层或调用Service层方法的上一层方法上添加 @DbReadonly 注释
2.通过此注释标识下面的读SQL的数据源将连接从数据库
二、自定义注释
// 程序运行时起作用 @Retention(RetentionPolicy.RUNTIME) // 使用位置放在方法定义的上面 @Target(ElementType.METHOD) // 文档注释 @Documented public @interface DbReadonly { // 默认值:readonly ,后续的拦截器、数据同步类需要获取此时定义的数据源 String value() default "readonly"; }
三、Spring 切面注入
@Aspect @Component public class DataSourceAspect { // 对应的切面位置 @Pointcut("@annotation(com.xxx.lang.annotation.DbReadonly)") public void dbAspect() { } // 在方法执行前将数据源切换到从库 @Before("dbAspect()") public void before(JoinPoint joinPoint) { DbContextHolder.setReadonly(); } // 在方法执行后将数据源切换到主库 @After("dbAspect()") public void after(JoinPoint joinPoint) { DbContextHolder.setMaster(); } }
四、读取当前的数据源配置
public class DbContextHolder { /** * 线程级参数 */ private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); /** * 动态数据库信息设定 * * @param dbType */ public static void setDbType(String dbType) { contextHolder.set(dbType); } /** * 动态数据库信息取得 * * @return */ public static String getDbType() { return ((String) contextHolder.get()); } /** * 动态数据库信息清空 * * @return */ public static void clearDbType() { contextHolder.remove(); } /** * 设定主库 */ public static void setMaster() { clearDbType(); } /** * 设定主库 */ public static void setReadonly() { setDbType("readonly"); } }
五、Spring-mybatis.xml 配置动态获取数据源
<bean id="dynDataSource" class="com.xxx.db.DynamicDataSource"> <!-- DynamicDataSource 继承 AbstractDataSource ,此处为targetDataSources赋值 --> <property name="targetDataSources"> <map key-type="java.lang.String"> <!-- 告知目前已有的数据源及对应的key --> <entry value-ref="dataSource" key="master"></entry> <entry value-ref="readonlyDataSource" key="readonly"></entry> </map> </property> <property name="defaultTargetDataSource" ref="dataSource" /> </bean>
六、动态读取当前数据源配置
public class DynamicDataSource extends AbstractRoutingDataSource { /** * 分配动态数据库 */ @Override protected Object determineCurrentLookupKey() { String obj = DbContextHolder.getDbType(); if (obj == null || obj.equalsIgnoreCase("default")) { return "master"; } else { return obj; } } }
七、数据库选择拦截器
// 默认数据源为主库,避免出现空值 public class DbSelectFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { DbContextHolder.setDbType("defalut"); chain.doFilter(request, response); } @Override public void destroy() { } }
八、Spring-mybatis.xml 加载
<!-- sqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" <!-- 配置数据源,为动态获取,动态获取中配置两个设置好的数据源配置 --> p:dataSource-ref="dynDataSource" p:typeAliasesPackage="com.xxx.core.model," p:mapperLocations="classpath*:com/**/mapping/*Mapper.xml"> <property name="configLocation" value="classpath:conf/mybatis-config.xml" /> </bean>
项目运行:
1.每一个请求都经过拦截器处理,默认处理成读取主库
2.当在service 中的 method上有使用 @DbReadonly 注释时,Spring 面向切面的标识
在方法执行前将 数据源切换到从库,在方法执行后切换到主库
项目备注:
1.不可多次套用此标签,即在调用 Service 处(对外提供的调用接口,用于对于某一具体需求进行处理,同时调用多个Service 接口)使用,同时在Service 中使用,会导致切换失败
分析:
A 调用 B
A 上使用了此标签,切换到 从库
B 上使用了此标签,切换到 从库,B 方法执行完毕,切换到主库
A 接收B 方法的返回值
A 中其他方法,运行,若此时其他方法上未加此注释,则数据源此时已被切换到了主库上
A 调用完毕,切换到主库
发表评论
-
使用软引用构建敏感数据的缓存
2017-11-16 22:19 801使用软引用构建敏感数 ... -
JSP自定义标签
2017-11-14 20:35 308JSP页面中分页功能实现使用了 <urlChange ... -
手机号码替换中间四位
2017-10-24 21:41 890需求描述: 为用户隐私考虑,展示用户信息时需要将中间用*代替 ... -
遍历集合删除元素
2017-10-24 18:44 609一、根据下标删除元素 1.测试代码 ArrayLis ... -
统计每天的数据
2017-10-10 21:23 495需求:按天统计数据 分析:create_time 为 dat ... -
服务器文件下载
2016-03-27 09:53 342项目需求:在列表页面上提供文件下载链接 项目实现: 1.准 ... -
扫码登录功能实现
2015-08-21 08:19 481需求:PC端(电脑端) ... -
基于SHIRO实现用户登陆后跳转其匿名访问的URL路径
2015-07-15 15:03 3576需求描述: 用户在未登录时访问网站中某个需要登录后才能访问 ... -
基于SHIRO的管理后台权限认证系统实现(一)
2015-07-09 10:05 6937基于SHIRO的管理后台权限认证系统实现(一) 一、项目需求 ... -
基于SHIRO的管理后台权限认证系统实现(二)
2015-06-28 10:14 778用户登陆系统后左侧菜单加载 项目:管理员系统 功能:用户登 ... -
Velocity中set的使用
2015-05-26 10:46 494问题:从页面接收某字段的提交数据,数据要求是组合后的编号 ... -
Velocity页面中输出时间年月
2015-05-19 20:52 938问题:注册页面要求有创建时间的选项添加,年为至今为止 实现: ... -
Set判重操作实现
2015-05-15 15:28 757需求:Set<Po>判重操作实现 问题:Set& ... -
如何去除List集合中的重复数据
2015-05-15 13:12 871需求:用户权限查看, ... -
Date相关功能实现
2015-05-12 19:47 583一、同一天 需求:用户记录跟踪列表展示,要求用户数据同一天内 ... -
velocity截取过长的字段值
2015-05-11 20:06 332问题:页面列表展示时,某个字段的值超长,影响页面的整体样式 ... -
将list中某个元素放在首位
2015-05-10 17:25 4495需求:程序开发过程中,业务方要求在展示国家列表时要将US放在首 ... -
Velocity遍历map与遍历list
2015-04-22 20:16 6890问题: 向页面传递key与value的组合 1. 1.1 ...
相关推荐
springboot2.0+mybatis主从数据库双数据源,测试了事务,事务是单独分开的。回滚只回滚主库的事务。
该案例中采用主从数据库,主数据写,从数据负责读取,实现了读写分离
mysql主从数据库配置详细步骤,自己实验后得出的步骤文档
MySql主从数据库搭建,Linux Mysql数据库安装 ,通用主从备份策略,Mysql 读写分离数据端配置
Linux,Centos的主从数据库配置
mysql主从数据库的优势
该文档详细描述了linux环境下mysql主从数据库的详细安装操作步骤(带截图)
springboot 配置主从数据库涉及的各类细节。对初次解除主从数据库的开发
SQL Server 2008 R2 数据高可用性技术之一:主从数据库同步配置实例
SQLServer2008R2主从数据库同步
MYSQL主从数据库介绍__主库__从库.pdfMYSQL主从数据库介绍__主库__从库.pdfMYSQL主从数据库介绍__主库__从库.pdfMYSQL主从数据库介绍__主库__从库.pdfMYSQL主从数据库介绍__主库__从库.pdfMYSQL主从数据库介绍__主库...
MYSQL主从数据库介绍__主库__从库.docxMYSQL主从数据库介绍__主库__从库.docxMYSQL主从数据库介绍__主库__从库.docxMYSQL主从数据库介绍__主库__从库.docxMYSQL主从数据库介绍__主库__从库.docxMYSQL主从数据库介绍_...
针对网络上的sql server的发布和订阅,进行了验证,发现只是进行了基本的发布和订阅操作,但是对使用环境和使用前提都没做出说明,此文档增加了对环境设置的操作步骤
基于docker部署主从MYSQL数据库.pdf
本压缩文件包含两个pdf文件,详细讲解了如何在Linux系统中安装Docker、如何在Docker中安装和配置MySQL主数据库、如何在Docker中安装和配置MySQL从数据库以及如何验证主从数据库搭建正常,视频教程:...
Linux主从数据库
主要介绍了MHA实现mysql主从数据库手动切换的方法,详细的讲述了主从数据库切换的步骤与方法,非常实用,需要的朋友可以参考下
主从数据库的搭建方式