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&静态方式缺乏灵活性,无法

根据系统负载、用户需求等情况,实现资源的快速动态收缩,

编程),是一种称为“横切”的技术,把与业务无关逻辑,但为

业务模块共同调用的逻辑或功能封装起来,将其命名为"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,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 Da­taSource

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.

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所示&DynamicDataSourceAspectBoot的自动数据源配置,主要实现方法如下&@ BeanO"

dynamicDataSource")MultiDynamicDataSource|数据库|public

DataSource

dynamicDataSource()

{Map〈Object,

Object>

targetDataSources

=

newHashMap

Object〉O;targetDataSources

put

O"

master"

!

masterData-

SourceO));1、取得映射的

sql语句

findStudentB

yldi

2、访问数据,被切面拦截'3、判断出是find开头的

sql语句,设置读数据源

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、根据返回的

读数据源,访问

读数据库1115、dctcrmincTargctDataS

|

4一ource()根据上面

|dctcrmncCurrcntT,ook

]upKey()B数返回的key

■值选择一个指定的数据源|DataSourceO);dataSourcesetTargetDataSourcesOtargetDataSourc-

图3数据访问流程es);(1)客户端访问数据库,正常流程走到DAO层?MyBa-

dataSource

setDefaultTargetDataSource

OmasterData-

tis进行映射接口,取得映射的sql语句,如findStudentByIdoSourceO));(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

= trueusername:

studbaO)返回要访问的数据源,本次访问返回的是读数据源&password"stuDba1driverClsssName

:

com.

mysql.

cj.

jdbc.

Driver

slave://读数据源的配置urlO)根据返回的读数据源,访问读数据库&2.5

应用验证通过学生ID查询学生信息进行验证,查询操作到读库

jdbc

:

mysql://192.

168.

10.

13

:

3306/slavedb?

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

SQL

id是findStudent

coding

=

utf8&useSSL

=

false

&serverTimezone

=

UTC

rewriteBatchedStatements

= trueusername:

studbaById,

*htp

://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-49191366-1368[2

*

Utgoff

P

E,

Connell

M

E.

Real-time

combinatorial

optimization

for

elevator

group

dispatching)J*.

IEEE

)10*

朱盐,刘跃敏.新型目的层预约的人工免疫电梯群控

策略)J*.电气传动,2012,42(9):ctions 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|urationg48d20fl8b由

to

execute

findStudentMdl

[炯M齣。|5丄眈

DBtBSourw

begin

to

execute

tindStudentByld

|

諒齣2020-06-12

20:37:21.622

INFO 13076

[nio-8080-exec-l]

DataSource2。20场6・12

20:37:22.192

INFO

13876[

卑—[nio-B080-exec-l] DstaSourcefinish

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・


本文标签: 数据源 实现 进行