admin 管理员组文章数量: 887021
2024年2月19日发(作者:header在css中是什么意思)
Microcomputer
Applications
Vol.
37,No.
2,2021研究与设计微型电$%用2021年第37)第2期文章编号:1007-757X(2021)02-0084-03基于Spring
Boot与MyBatis框架构建动态读写分离模型张旭刚,张昕,高若寒(国电南瑞科技股份有限公司信息系统集成分公司,江苏南京210000)摘要:读写分离集群,是当前系统应对高并发、大吞吐量的一种方法,也是一种保障系统业务连续性的方法°现有实现读写
分离集群的工具和方法,主要是一种静态部署,不适应资源横向扩展、动态伸缩的需求,不能够快速响应外部需求的变化°
'
用Spring
Boot和MyBatis框架提供的技术优势,通过面向切面编程AOP,提供一种动态的低耦合的读写分离方法,数据源可
以横向扩展,根据需求动态收缩,并对应用程序透明"关键词:读写分离;Spring
Boot;
MyBatis;
AOP中图分类号:TP301
文献标志码:AA
Way
Realizing
Separation of
Reading
and
Writing
Based
onSpringBootand
MyBatisZHANG
Xugang,
ZHANG
Xin,
GAO
Ruohan(Information
System
Integration
Branch!Guodian
Nanrui
Technology
Co
!Ltd
!Nanjing210000!China)Abstract:
The
separation
of
reading
from
writing
is
a
way
in
dealing
with
high
concurrence and
high
throughput,
also
a
way
to
enhance
business
continuity.
The
majority
of
main
ways
and
tools
provides
a
static
deployment.
The
static
deployment
is
lack
ofscaled-outanddynamicscalability
Itcannotberapidlysatisfied
withouterrequirementchanges
Thistopic!usingSpring
Bootand
MyBatisframework
with
AOP!providesadynamicandlow-coupling
way
Thedatasourcesarescaled-outanddy-
namicalyscalable
AnditistransparenttoapplicationprogramKey
words:
separation
of reading
and
writing;
Spring
Boot;
MyBatis;
AOP0引言向切面编程技术AOP、MyBtis映射.SpringBoot的类Ab-
stractRoutingDataSource
ThreadLocal
程间读写分离集群,不仅提高了系统的健壮性和可靠性,以
及系统的吞吐量和性能,保障了系统业务的连续性,而且也
实现了资源的最大利用率&当前的实现方法主要通过静态
的数据隔离(1)&11
Spring
AOPSpring
AOP(Aspect-Oriented
Programming,
面向
切面
方式配置,主要有中间件方式,如amoeba和mysql-proxy,分
业务方式,对读写操作配置uO&静态方式缺乏灵活性,无法
根据系统负载、用户需求等情况,实现资源的快速动态收缩,
编程),是一种称为“横切”的技术,把与业务无关逻辑,但为
业务模块共同调用的逻辑或功能封装起来,将其命名为"Aspect”,
即方面,减少系统的重复代码,降低模块间的耦合度,
难以满足在不停机的条件下进行数据源切换,无法保证业务
便于后期的操作和维护&在论文中,主要使用AOP的前置
通知,拦截MyBatis映射的SQL语句,动态选择数据源&12
MyBatis的连续性&利用Spring
Boot和MyBatis框架提供的优势,通过面
向切面编程AOP,实现一种对应用透明、数据源可以动态收
缩与切换的模型&Mybatis是一个支持普通SQL查询、存储过程和高级映
射的优秀持久层框架,在持久层映射关系的开发中,可以不
1
Spring
Boot
用写实现类,能以代理方式自动生成实现代码,同时SQL语
句写在映射XML文件中,实现了代码与SQL分离,降低耦
合度&在映射XML文件中,通过id标识不同类型的SQL
语句,对查询、插入、删除和更新语句进行区分如口查询语句
架构Spring
Boot是由Pivotal团队提供,简化Spring开发的
微服务框架&通过约定优于配置和起步依赖,简化复杂的依
赖关系,大量减少XML配置文件,基本实现自动化位置,能
够快速创建独立运行的Spring项目,并且集成了主流框架,
的id前缀为query,删除语句的id前缀为delete,通过甄别判SQL
语
选择
的数据
!
的分离&如AOP和MyBatis&为实现动态读写分离模型,主要利用面作者简介:张旭冈IJC979-),男,硕士,助理工程师,研究方向:计算机应用技术。张昕(1973-),男,硕士,高级工程师,研究方向:大型企业信息化规划&高若寒(1989-),女,本科,助理工程师,研究方向:计算机应用技术。・84・
Microcomputer
Applications
Vol.
37,No.
2,20211
3
AbstractRoutingDataSource研究与设计微型电脳%用2021年第37
)第2期Spring
Boot
提供了
Abstract
Routing
Data
Source
根据
用户定义的规则选择当前的数据源,可以在执行SQL操作
前!
的数据源!
由数据源的模型,它的方ZE法determine
Target
Data
Source#返回一个数据源,在该方
法内部会调用抽象方法determine
Current
Lookup
Key#决
持久层MyBatis
u定使用哪个数据源‘lookup
key键通常是通过Thread
Local
定的上下文
MyBatis
映射文件&(动态数据源)1
4
ThreadLocalThread
Local作用是提供线程内的局部变量,维护变量
时Thread
Local为每个使用该变量的线程提供独立的变量
副本&在面向切面编程AOP的前置通知中通过Thread
Local
程的数据源类型,是读数据源还
数据源&在返回
数据源的时候,通过determine
Current
Lookup
Key#调用
生产库
备库图1总体结构图Thread
Local取得线程的数据源类型,从而为本次
具体的数据源!
还
⑵。指定2动态读写分离设计与实现2.1
总体架构程序实现基于Spring
Boot框架,通过Maven进行编译、
测试和打包&
Spring
Boot基于Spring,减少了配置,简化了,使开发更高
端即
整体
五层,
客户程序,发起数据访问;第二
DAO(数据访图2读写分离的实现类图问对象),访问的sql语句配置在MyBatis的映射文件里,与
程序的DAO
映射关系,由MyBatis自动实现接口的文件,对数据
行
;
,AOP,即面向切面编程fig配置多个数据源,在应用启动后有多个数据源可以选择&DynamicDataSource!
取数据
的 数据
!如果
DAO
数据
态选择数据源,如果
前,进行拦截,根据
语句则
id进行动操作,返回只读库数据源如口果
删改则
],如果是修改语写库。继承
Abstract
Routing
Data
Source并重写其中的方
句则y指向
数据库,实现数据的
、高
,
能有负数据
由等;第个数据库、SQL
、
法
determine
Current
Lookup
Key
(),该方法调用封装了
ThreadLocal
的
DatabaseContext
Holder!
取当
前
程的四层,创 个数据源,每个数据源创
DatabaseType。资源池,分别指向写数据
间,通过binlog进行数据
数据库;第五层,主备数据库Data
Source
Context
Holder,用户设置数据库访问的数
据源,具体设置通过切面拦截调用该类的方法set
Data
步,并进行故障切换⑷。通过上面五层,与Spring
Boot和MyBatis架构构建程
程
明,无任何侵入,原程
简
何改5Source
Type。该类拥有一个Thread
Local的静态常量私有
属性
private
static
final
Thread
Local
<
String)
CONTEXT.
的数据
)。明,HOLDER
=
new
Thread
Local
String)(),静态方法
set DataSource
Type#StringdataSource
Key)
每个
数据
的
程
构可以进行横向扩展,当性能无法满足需
求时,添加数据源,添加数据库,进行负
如图1所示&getDataSource担,
TypeO通过属性,用于标识数据源,
的数据
。2.2
读写分离的实现MySQL
数据
的
!
的Dynamic
Data
Source
Aspect用于定义要拦截的SQL操
作,通过前置通知解析MyBatis中配置的id,根据id判断
SQL
操作
操作还
删
!并
DataSourceContext类图如口图2所示&由
四个类
!DynamicDataSource
的根据数Holder的
方
当前线程的数据源类型。在进行数据源的值返回数据源;Data
Source Context
Holder圭寸装了
据源选择时.Dynamic
Data
Source返回设置的当前线程的数
Thread
Local,
取本次访问的数据源的值dy据源类型,当前线程准
的数据源&它的主namic
Data
Source
Aspect实现AOP的前置通知,拦截和解
析SQL的id,根据id
方如。@
Pointcut
(
"
execution
(
*
com.
sboot.
dao.
*
.
-(..)))操作还
操作,通过DataSource
Context
Holder动态设置数据源的值,然后Dynamic
DataSource
取
的
数据
;
MultiDataSourceCon-public
void
daoAspect()
{85
Microcomputer
Applications
Vol.
37,No.
2,2021研究与设计微型电脳%用2021年第37
)第2期password
stuDba1@Before#
"daoAspect()
”)public
void
switchDataSource(JoinPoint
point)
{System,
out.
printin#"
Begin
to
execute
"
+
point.
getSig-
natureO.
getNameO
);据driverClsssName
:
com.
mysql.
cj.
jdbc.
Driver
然后在类DataSourceConfig中,利用注解的方式生成数
©PrimaryBoolean
isQueryMethod
=
isQueryMethod
(
point.
@
Bean("
masterDataSource")@
ConfigurationPropertiss
(
prefix
=
"
spring.
datagetSignatureO.
getNameO);if
(isQueryMethod)
{DataSourceContextHolder.
setDataSourceType("slave");System,
out.
println("Slave
DataSource
begin
to
exsource
master"
)public
DataSource
masterDataSource()
{
return
DataSourceBuilder.
createO.
buildO
;ecute
"+
point.
getSignatureO.
getNameO);-通过@
ConfigurationPropertiss注解把在配置文件的配
--Multi
Data
Source
Config,是一个基于注解的配置,主要
封装了写和读两个数据源,实现多数据源,需要取消Spring
置自动的匹配配置数据源需要的值,生成数据源&备数据源
的原理与上面一致&2.4
数据访问流程数据访问流程如口图3所示&DynamicDataSourceAspectBoot的自动数据源配置,主要实现方法如下&@ BeanO"
dynamicDataSource")MultiDynamicDataSource|数据库|public
DataSource
dynamicDataSource()
{Map〈Object,
Object>
targetDataSources
=
newHashMap
版权声明:本文标题:基于Spring Boot与MyBatis框架构建动态读写分离模型 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1708351365h520984.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论