基于Spring Boot与MyBatis框架构建动态读写分离模型

基于Spring Boot与MyBatis框架构建动态读写分离模型


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

Object

O

targetDataSources

put

O

"

master"

!

masterData-

Source

O))

1

取得映射的

sql

语句

findStudentB

yld

i

2

访问数据

被切面拦截

'

3

判断出是

find

开头的

sql

语句,设置读数据源

DataSourceContextHol

aSourceType

("slave")

4

在方法

determineCurrentLook

upKey()中返回数据源

I

[

类型

return

I

DataSourceContextHol

|

一-—

aSourceTypeO

|

targetDataSources

put

O

"slave"

!

slaveDataSource

6

返回要访问

的数据源

本次

访问返回的是读

数据源

O))

DynamicDataSource

dataSource

=

new

Dynamic-

1

1

I

7

根据返回的

读数据源

访问

读数据库

1

1

1

5

dctcrmi

ncTargctDataS

|

4

ource()

根据上面

|

dctcrm

ncCurrcntT,ook

]

upKey()B

数返回的

key

值选择一个指定的数据源|

DataSource

O)

dataSourcesetTargetDataSources

O

targetDataSourc-

3

数据访问流程

es

)

(1)

客户端访问数据库

正常流程走到

DAO

?

MyBa-

dataSource

setDefaultTargetDataSource

O

masterData-

tis

进行映射接口

取得映射的

sql

语句

findStudentById

o

Source

O))

(2)

取得

sql

语句访问数据库

&

(3)

通过

©

Before

(

"daoAspectO

")

拦截访问

并检查是

查询语句

设置数据源为读数据库

o

判断出是

fnd

开头的

sql

语句

设置读数据源

Data-

returndataSource

-

2.3

配置多数据源

application,

yml

中添加两个数据源

:

SourceContextHolder.

setDataSourceType(

"

slave"

)

&

pring:

datssource

(4)

MultiDynamicDataSource

在方法

determineCurrentLooYupKey(

)

中返回数据源类

return

DataSourceContextHolder.

getDataSourceTypeO

&

master

//

写数据源的配置

url

"

jdbc

mysql

//192.

168.

10.

12

3306/masterdb?

characterEn­

(5)

MultiDynamicDataSource

的方法

determineTargetDataSource

((

determineCur-

rentLooYupKey

(

)

函数返回的

Yey

值选择一个指定的数

据源

coding

=

utf8&useSSL

=

false

&serverTimezone

=

UTC

rewriteBatchedStatements

=

true

username

studba

O)

返回要访问的数据源

本次访问返回的是读数

据源

&

password

"

stuDba1

driverClsssName

:

com

.

mysql.

cj.

jdbc.

Driver

slave

//

读数据源的配置

url

O)

根据返回的读数据源

访问读数据库

&

2.5

应用验证

通过学生

ID

查询学生信息进行验证

查询操作到读库

jdbc

:

mysql

//

192.

168.

10.

13

:

3306

/

slavedb

?

characterEn­

进行操作&查询学生信息的

MyBatis

SQL

id

findStudent

coding

=

utf8&useSSL

=

false

&serverTimezone

=

UTC

rewriteBatchedStatements

=

true

username

studba

ById

,

*

h

t

p

//

192.168.1.10

8080

/

stuInfo

,

(

98

$

86

Microcomputer

Applications

Vol.

37,

No.

2,2021

研究与设计

微型电脳%用

2021

年第

37

)第

2

实现对

Elevator

Simulation

模型的控制过程

以此实现对

单梯控制方式的可靠性进行验证

利用

TIAProtal

编写

S7-

1200PLC

程序

采用

TIA

来实现结构化编写的过程

用户程

supervisory

control

system

using

genetic

networY

pro-

gamming)

*.

IEEJ

Transactions

on

Electrical

and

E

­

lectronic

Engineering,

2010

,

6(S1)

:

S65-S73.

序通过

的方式进行单独编写&

(2)

进行仿真时根据高层写字楼中的实际客流信息进

[

6

*

鹿

吕征宇.基于

LSSVM

的电

梯交通

模式的模

糊识别

[

J

*.

浙江大学学报(工学版

)

2012,46

(7

)

1333-1338

行分析

选择其余交通模式来完成群控算法的仿真

利用客

流模块来自主获得不同模式的乘客数据流

采用层间交通

模式时可以降低高峰段的乘客人数

并且这两种方式都表现

[

7

*

张健

王笑竹

.

改进

GA

优化

BP

神经网络的电梯群

控策略

[

J

*

.

陕西理工学院学报

自然科学版

2015

,

31

(

4

)

36-39

为较低的平均乘梯时间

在各类交通模式下可按照实际条

件把权值赋予评价指标函数

从而达到各交通模式下都能获

:

8

*

许玉格

罗飞

曹建忠

.

目的层预约的模糊神经网络

电梯群控策略

[

J

*

.

理工大

学学报

(自

然科学

版)

得最佳电梯群性能&

参考文献

:

1

*

毕晓亮

李伟

朱昌明

.

电梯群控系统多目标控

制策略

J

*

.

上海交通大学学报

2004

,

38

(

8

):

2007

,

35

1

)

13-18

[

9

*

Fernandez

J

,

Cortss

P

,

Munuzuri

J

,

et

al

.

Dynamic

fuzzylogicelevatorgroupcontrolsystem

withrelative

waiting

time

consideration)

J

*.

IEEE

Transactions

on

IndustrialElectronics

!

2014

!

61

(

9

)

4912-4919

1366-1368

2

*

Utgoff

P

E

,

Connell

M

E

.

Real-time

combinatorial

optimization

for

elevator

group

dispatching)J*.

IEEE

)

10

*

刘跃敏.新型

的层预约

的人工免疫

电梯群控

策略

)

J

*

.

电气传动

2012,42(9):5155.

Transactions

on

Systems

,

Man

,

and

Cybernetiss

)

11

*

于德亮

唐海燕

.

基于粒子群优化模糊核

类的电

梯群

交通

式识别

)

J

*

.

滨工

业大学学

Part

A

Systems

and

Humans

,

2012

,

42

(1

)

130

­

146.

2012,44(10):8488.

:

3

*

俞雯

.

基于多

标规划算法的智能电梯群控系统的

研究

D*

.

州:

江工业大学

2008.

)

12

*

AhmadF

!

FaYhirI

!

KhanSA

!

etal

Petrinet-based

modeling

and

controlofthe

multi-elevator

systems

4

*

闫冬梅,

顾德英

.

电梯群控预约控制算法

J

*

.

现代电

技术

2004

,

27(12

):

98-99.

)

J

*

Neural

Computing

and

Applications

!

2014

!

24

(7/8

)

16011612.

(收稿日期

2020.

02.

25

)

5

*

Yu

L

,

Mabu

S

,

Hirssawa

K.

Multicar

elevator

group

(上接第

86

)

行查询

日志输出信息

如图

4

所示&

2020-06-12

20:37:21.452

INFO

13076

[nio-B080-exec-l]

cherServlet

f'm

Ming

rliitiimiirrp"

nrg

R

hp|urationg48d20fl8

b

to

execute

findStudentMdl

[炯

M

|5

丄眈

DBtBSourw

begin

to

execute

tindStudentByld

|

諒齣

2020-06-12

20:37:21.622

INFO

13076

[nio-8080-exec-l]

DataSource

2

20

6

12

20:37:22.192

INFO

13876

[

[nio-B080-exec-l]

DstaSource

finish

to

executE

find5tudentById

4

测试验证

参考文献

)

1

*

)

2

*

)

3

*

)

4

*

)

5

*

)

6

*

汪胜和

雷霆

黄太贵

.

多数据源调度报表系统的设

计与开发)

J

*

.

江苏电机工程

2008,27(1

)

55-57.

刘同.负载均衡技术在数据库集群系统中的应用与实

T*.

2009,2-3.

龙中华.

Spring

Boot

实战

M

*.北京

电子工业出版

日志打印出执行

sql

语句

findStudentById

动态选择读

数据源

Slave

DataSource

执行

,

2020

相民.

租户

SaaS

应用中的

MySQL

集群性

研究

3

本文基于

Spring

Boot

MyBatis

框架

实现了动态的

MySQL

读写分离模型

方法简单

便捷

,对应用透明

低耦

)

TP391

*

2015

,

43-61

苏子权.基于

MySQL

Binlog

的数据增量同步系统的

设计与实现

TP311.

52

*

2018.

07.

无侵入性

安装和拆卸对现有程序无任何影响

没有额外

(美)克雷

格•活斯

(Craig

Walls

)

.

Spring

Boot

实战

的成本

后续可加入多数据源

通过

zooYeeper

进行状态监

控和管理,实现更智能和动态的数据库的横向扩展和收缩

满足云计算场景需求&

M

*.北京

人民邮电出版社

2016.

(

收稿

+

20200702

)

98


发布者:admin,转转请注明出处:http://www.yc00.com/web/1715095172a2565219.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信