2024年5月7日发(作者:)
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
文献标志码
:
A
A
Way
Realizing
Separation
of
Reading
and
Writing
Based
onSpringBootand
MyBatis
ZHANG
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-
namica
l
yscalable
Anditistransparenttoapplicationprogram
Key
words
:
separation
of
reading
and
writing
;
Spring
Boot
;
MyBatis
;
AOP
0
引言
向切面编程技术
AOP
、
MyBtis
映射
.
SpringBoot
的类
Ab-
stractRoutingDataSource
ThreadLocal
程间
读写分离集群
,
不仅提高了系统的健壮性和可靠性
,
以
及系统的吞吐量和性能
,
保障了系统业务的连续性
,
而且也
实现了资源的最大利用率&当前的实现方法主要通过静态
的数据隔离
(
1
)
&
11
Spring
AOP
Spring
AOP
(
Aspect-Oriented
Programming
,
面向
切面
方式配置
,
主要有中间件方式
,
如
amoeba
和
mysql-proxy
,
分
业务方式
,
对读写操作配置
u
O
&
静态方式缺乏灵活性
,
无法
根据系统负载
、
用户需求等情况
,
实现资源的快速动态收缩
,
编程)
,
是一种称为
“
横切
”的技术,
把与业务无关逻辑
,
但为
业务模块共同调用的逻辑或功能封装起来
,将其命名为
"
As
pect
”
,
即方面,
减少系统的重复代码
,
降低模块间的耦合度
,
难以满足在不停机的条件下进行数据源切换
,
无法保证业务
便于后期的操作和维护&在论文中
,
主要使用
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,2021
1
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
映射文件
&
AOP
(
动态数据源)
1
4
ThreadLocal
Thread
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
架构构建程
程
明
,
无任何侵入
,
原程
简
何改
5
Source
Type
。
该类拥有一个
Thread
Local
的静态常量私有
属性
private
static
final
Thread
Local
<
String
)
CONTEXT
.
的数据
)
。
明
,
HOLDER
=
new
Thread
Local
String)
()
,
静态方法
set Da
taSource
Type
#
StringdataSource
Key
)
每个
数据
的
程
构可以进行横向扩展
,
当性能无法满足需
求时
,
添加数据源
,
添加数据库
,
进行负
如图
1
所示
&
getDataSource
担
,
TypeO
通过
CONTEXT
.
HOLDER
属性
,
用于标识数据源
,
的数据
。
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.
*
.
-
(..)))
操作还
操作
,
通过
Data
Source
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
中
,
利用注解的方式生成数
©Primary
Boolean
isQueryMethod
=
isQueryMethod
(
point
.
@
Bean(
"
masterDataSource"
)
@
ConfigurationPropertiss
(
prefix
=
"
spring.
data
getSignatureO
.
getNameO)
;
if
(isQueryMethod)
{
DataSourceContextHolder.
setDataSourceType("slave"
)
;
System,
out.
println("Slave
DataSource
begin
to
ex
source
master"
)
public
DataSource
masterDataSource(
)
{
return
DataSourceBuilder.
createO
.
buildO
;
ecute
"+
point.
getSignatureO.
getNameO)
;
-
通过
@
ConfigurationPropertiss
注解把在配置文件的配
-
-
Multi
Data
Source
Config,
是一个基于注解的配置
,
主要
封装了写和读两个数据源
,
实现多数据源
,
需要取消
Spring
置自动的匹配配置数据源需要的值
,
生成数据源&备数据源
的原理与上面一致
&
2.4
数据访问流程
数据访问流程如口图
3
所示
&
DynamicDataSourceAspect
Boot
的自动数据源配置
,
主要实现方法如下
&
@
BeanO
"
dynamicDataSource"
)
MultiDynamicDataSource
|数据库|
public
DataSource
dynamicDataSource(
)
{
Map
〈
Object
,
Object
>
targetDataSources
=
new
HashMap
发布者:admin,转转请注明出处:http://www.yc00.com/web/1715095172a2565219.html
评论列表(0条)