CN113835690A - 读写分离多数据源组件及其工作方法 - Google Patents
读写分离多数据源组件及其工作方法 Download PDFInfo
- Publication number
- CN113835690A CN113835690A CN202111114158.8A CN202111114158A CN113835690A CN 113835690 A CN113835690 A CN 113835690A CN 202111114158 A CN202111114158 A CN 202111114158A CN 113835690 A CN113835690 A CN 113835690A
- Authority
- CN
- China
- Prior art keywords
- data source
- read
- statement
- component
- write
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/21—Design, administration or maintenance of databases
- G06F16/214—Database migration support
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/242—Query formulation
- G06F16/2433—Query languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/61—Installation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Databases & Information Systems (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Mathematical Physics (AREA)
- Computing Systems (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提出一种读写分离多数据源组件及其工作方法,首先把数据源与读写数据源配置在yml格式的文件中。当应用执行语句时,拦截器会从缓存中,读取数据源组配置信息,确定读数据源与写数据源。接着解析获取到的SQL语句,从中解析出语句类型与指定数据源信息。根据这些信息判定来决定下一步的所要选择的数据源策略。然后根据策略来切换当前线程的数据源,执行当前语句,语句执行后,清空当前线程数据源,恢复为切换前的状态。业务工程在相应的pom文件中进行引用,并在启动类上注册该组件,从而完成组件安装工作。本发明不仅降低了代码编写的复杂度,提高了系统的可维护性,而且在自动切换场景下甚至可以实现零编码,保障了应用开发的质量。
Description
技术领域
本发明属于应用开发等技术领域,尤其涉及一种读写分离多数据源组件及其工作方法。
背景技术
在高并发的应用场景下,即使使用了缓存技术,也仍然存在部分的读操作(因为存在访问缓存没有命中或者缓存过期等情况)和全部的写操作需要访问数据库。所以当用户量与并发量达到一定规模时,数据库还是会因为负载过高而成为系统的性能瓶颈。这时就会采用读写分离的数据库架构体系。在这一体系之下,一般会在服务器端使用专门的数据访问组件,让数据库的读写分离机制对应用程序透明。
现有的数据访问组件,一般分为以下2种类型:
1. 通过Java注解方式来指定数据源,比如dynamic-datasource-spring-boot-starter 组件。
2. 基于某种数据库的应用中间件,比如 MyCat。
但是,上面这些组件存在以下2个问题:
1. 必须由开发人员编码来指定数据源,这样做不仅容易出错,而且加大了开发人员的工作量(第一种类型)。
2. 与某个数据库强绑定,不支持多种数据库。比如 MyCat 就与 MySQL 数据库强绑定,不支持 PostgreSQL 数据库。在去 Oracle 的大背景前提之下,因为PostgreSQL数据库的语法与 Oracle数据库很相似,所以现在很多应用需要从Oracle 数据库迁移到PostgreSQL数据库。随着PostgreSQL 数据库变得越来越流行,也就要求数据访问组件必须支持PostgreSQL数据库(第二种类型)。
发明内容
本发明的目的在于针对上述现有技术的缺陷和不足,提供一种读写分离多数据源组件及其工作方法。能够实现读写分离自动切换,并且支持配置切换指定到数据源,从而实现个性化数据源切换。这样做不仅降低了代码编写的复杂度,提高了系统的可维护性,而且在自动切换场景下甚至可以实现零编码,保障了应用开发的质量。
本发明具体采用以下技术方案:
一种读写分离多数据源组件,其特征在于:
根据业务场景,以 yml 格式定义需要访问的多个数据源;并定义数据源组,组内存放主从数据源名称;
在应用启动场景中,系统初始化数据源相关配置信息;
在SQL语句执行场景中,通过拦截语句,并依据数据源组内的读写数据源信息,进行数据源切换,从而实现读写分离自动切换执行功能或指定数据源执行功能;
在业务工程使用场景中,将读写分离多数据源组件打成 jar包,并发布到 Maven私服;其它业务工程只需在相应的 pom 文件中进行引用,并在SpringBoot 框架的启动类上注册该组件,即可实现读写分离数据源自动切换功能。
进一步地,数据源信息由dynamic-datasource-spring-boot-starter 组件执行数据源初始化操作。
进一步地,数据源组信息以单例对象的形式载入缓存。
进一步地,对于需要在指定数据源执行语句的业务场景,如果所指定的数据源并不是所配置的主从数据源,则在语句前通过特殊前缀指定所需执行的数据源名称。
进一步地,在SQL语句执行场景中,通过拦截语句,并依据数据源组内的读写数据源信息,进行数据源切换具体包括以下步骤:
步骤1:通过 MyBatis 拦截器,拦截所要执行的语句,包括:新增、插入、更新与删除语句;
步骤2:从缓存中读取数据源组配置信息,确定读数据源与写数据源;
步骤3:解析获取到的SQL语句,从中解析出语句类型与指定数据源信息;
步骤4:如果发现指定数据源,则执行“指定数据源”策略;
步骤5:如果没有发现指定数据源,则进一步判定语句类型;如果语句类型是查询,则执行“读数据源”策略;如果语句类型是插入、新增、更新、函数或存储过程,则执行“写数据源”策略;
步骤6:依据相应的数据源策略,把当前线程的数据源切换到所要求的数据源;
步骤7:在切换后的数据源环境下,执行当前语句;
步骤8:语句执行后,清空当前线程数据源,恢复为切换前的状态。
以及一种计算机存储介质,其特征在于,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如上所述的读写分离多数据源组件或其工作方法。
一种读写分离多数据源组件的实现系统,其特征在于,包括存储器、处理器,所述存储器上存储有实现如上所述的读写分离多数据源组件或其工作方法的计算机指令,所述处理器在运行时执行存储器上存储的计算机指令。
本发明及其优选方案首先把数据源与读写数据源配置在yml格式的文件中。当应用执行语句时,拦截器会从缓存中,读取数据源组配置信息,确定读数据源与写数据源。接着解析获取到的SQL语句,从中解析出语句类型与指定数据源信息。根据这些信息判定来决定下一步的所要选择的数据源策略。然后根据策略来切换当前线程的数据源,执行当前语句,语句执行后,清空当前线程数据源,恢复为切换前的状态。业务工程在相应的 pom 文件中进行引用,并在启动类上注册该组件,从而完成组件安装工作。本发明不仅降低了代码编写的复杂度,提高了系统的可维护性,而且在自动切换场景下甚至可以实现零编码,保障了应用开发的质量。
与现有技术相比,本发明及其优选方案有以下有益效果:利用YML数据格式事先配置好读数据源与写数据源,并配合MyBatis的拦截器方法,实现了在语句执行前,自动切换到指定数据源的功能,从而避免了开发人员硬编码来指定数据源的弊端,这样做不仅不容易出错,而且减少了开发人员的工作量。支持多种数据库。只要是提供了 JDBC驱动包的数据库,本发明提供的组件都能够支持,这样可以最大限度地应用于基于各种异构数据库的业务工程项目。
附图说明
下面结合附图和具体实施方式对本发明进一步详细的说明:
图1是本发明实施例提供组件的基本工作逻辑示意图。
图2是本发明实施例工作流程示意图。
具体实施方式
为让本专利的特征和优点能更明显易懂,下文特举实施例,作详细说明如下:
应该指出,以下详细说明都是例示性的,旨在对本申请提供进一步的说明。除非另有指明,本文使用的所有技术和科学术语具有与本申请所属技术领域的普通技术人员通常理解的相同含义。
需要注意的是,这里所使用的术语仅是为了描述具体实施方式,而非意图限制根据本申请的示例性实施方式。如在这里所使用的,除非上下文另外明确指出,否则单数形式也意图包括复数形式,此外,还应当理解的是,当在本说明书中使用术语“包含”和/或“包括”时,其指明存在特征、步骤、操作、器件、组件和/或它们的组合。
如图1以及图2所示,本实施例提供读写分离多数据源组件及其工作方法,包括以下设置:
根据业务场景,以 yml 格式定义好需要访问的多个数据源;并定义数据源组,组内存放主从数据源名称。
在应用启动场景中,系统会初始化数据源相关配置信息。
在SQL语句执行场景中,通过拦截语句,并依据数据源组内的读写数据源信息,进行数据源切换,从而实现读写分离自动切换执行功能或指定数据源执行功能。
在业务工程使用场景中,把读写分离多数据源组件打成 jar包,并发布到 Maven私服。这样其它业务工程只需在相应的 pom 文件中进行引用,并在SpringBoot 框架的启动类上注册该组件,即可实现读写分离数据源自动切换功能。
在本实施例中,数据源信息由dynamic-datasource-spring-boot-starter 组件执行数据源初始化操作。
在本实施例中,数据源组信息以单例对象的形式载入缓存。
在本实施例中,SQL语句执行场景具体包括以下步骤:
步骤1:通过 MyBatis 拦截器,拦截所要执行的语句(包括新增、插入、更新与删除语句);
步骤2:从缓存中读取数据源组配置信息,确定读数据源与写数据源;
步骤3:解析获取到的SQL语句,从中解析出语句类型与指定数据源信息;
步骤4:如果发现指定数据源,则走“指定数据源”策略;
步骤5:如果没有发现指定数据源,则进一步判定语句类型。如果语句类型是查询,则走“读数据源”策略;如果语句类型是插入、新增、更新、函数或存储过程,则走“写数据源”策略;
步骤6:依据相应的数据源策略,把当前线程的数据源切换到所要求的数据源;
步骤7:在切换后的数据源环境下,执行当前语句;
步骤8:语句执行后,清空当前线程数据源,恢复为切换前的状态。
在本实施例中,通过 yml 格式的文件来配置数据源组,它最大的优点就是易于阅读,类似于以下形式:
datasource:
profile: 数据源组A
configs:
- name: 数据源组A
main-datasource: 写数据源名称
slave-datasource: 读数据源名称
- name: 数据源组B
main-datasource: 写数据源名称
slave-datasource: 读数据源名称
- …
支持事先配置多个数据源组,然后通过 profile 来指定所生效的数据源组。
在本实施例中,有的业务场景,需要在指定数据源执行语句,而所指定的数据源并不是之前所配置的主从数据源。这时就可以在语句前通过特殊前缀来指定所需执行的数据源名称。语句一般配置在XML中,语法基于 Mybatis,类似于以下形式:
<insert id="插入语句ID">
/*--数据源名称--*/insert into …
</insert>
通过采用数据库注释的方式来指定数据源名称,有利于降低组件的侵入性,即使由于某种原因不再使用本组件,也无须修改之前已经定义的特殊前缀。
本组件还支持为自定义的存储过程或者函数指定数据源,配置文件与语法与上例相同,类似于以下形式:
<select id="存储过程 ID" statementType="CALLABLE" useCache="false">
{
call 存储过程名称(
#{入参名称, mode=IN},/*--数据源名称--*/
#{出参名称, mode=OUT,jdbcType=VARCHAR}
…
)
}
</select>
由于存储过程或者函数语法的特殊性,不支持在 call 关键字之前定义注释,所以我们改为在第一个入参名称之后定义指定数据源名称;如果没有入参,则在第一个左括号“(”之后定义。
在本实施例中,自行定义了一个Mybatis 拦截器,用于在语句执行之前,拦截并切换当前线程的数据源。在实践的过程中,发现有的项目工程使用了PageHelper组件,该组件用于单表或者多表分页查询场景。PageHelper组件本质上也是一个自定义的Mybatis 拦截器,由于它在拦截之后不会把结果返回给下一个拦截器,所以在集成时,必须在PageHelper组件之后(拦截器链中的拦截器是从后往前依序执行)加载本组件。
综上,本实施例首先把数据源与读写数据源配置在yml格式的文件中。当应用执行语句时,拦截器会从缓存中,读取数据源组配置信息,确定读数据源与写数据源。接着解析获取到的SQL语句,从中解析出语句类型与指定数据源信息。然后根据这些信息判定来决定下一步的所要选择的数据源策略。接着根据所选择的策略来切换当前线程的数据源,执行当前语句,语句执行后,清空当前线程数据源,恢复为切换前的状态。业务工程在相应的pom 文件中进行引用,并在启动类上注册该组件,从而完成组件安装工作。本发明能够降低了代码编写的复杂度,提高了系统的可维护性,而且在自动切换场景下甚至可以实现零编码,最终保障了应用的开发质量。
本实施例具有以下优点:
1、零编码:利用YML数据格式事先配置好读数据源与写数据源,并配合MyBatis的拦截器方法,实现了在语句执行前,自动切换到指定数据源的功能,从而避免了开发人员硬编码来指定数据源的弊端,这样做不仅不容易出错,而且减少了开发人员的工作量。
2、个性化:有的业务场景,需要在指定数据源执行语句,而所指定的数据源并不是之前所配置的主从数据源。这时就可以在语句前通过特殊前缀来指定所需执行的数据源名称。
3、支持多种数据库:只要是能提供 JDBC驱动包的数据库,本组件都支持,这样可以最大限度地应用于基于各种异构数据库的业务工程项目,从而满足实际业务场景下的项目数据库迁移的需要。
本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
本专利不局限于上述最佳实施方式,任何人在本专利的启示下都可以得出其它各种形式的读写分离多数据源组件及其工作方法,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本专利的涵盖范围。
Claims (7)
1.一种读写分离多数据源组件,其特征在于:
根据业务场景,以 yml 格式定义需要访问的多个数据源;并定义数据源组,组内存放主从数据源名称;
在应用启动场景中,系统初始化数据源相关配置信息;
在SQL语句执行场景中,通过拦截语句,并依据数据源组内的读写数据源信息,进行数据源切换,从而实现读写分离自动切换执行功能或指定数据源执行功能;
在业务工程使用场景中,将读写分离多数据源组件打成 jar包,并发布到 Maven 私服;其它业务工程只需在相应的 pom 文件中进行引用,并在SpringBoot 框架的启动类上注册该组件,即可实现读写分离数据源自动切换功能。
2.根据权利要求1所述的读写分离多数据源组件,其特征在于:数据源信息由dynamic-datasource-spring-boot-starter 组件执行数据源初始化操作。
3.根据权利要求1所述的读写分离多数据源组件,其特征在于:数据源组信息以单例对象的形式载入缓存。
4.根据权利要求1所述的读写分离多数据源组件,其特征在于:对于需要在指定数据源执行语句的业务场景,如果所指定的数据源并不是所配置的主从数据源,则在语句前通过特殊前缀指定所需执行的数据源名称。
5.根据权利要求1所述的读写分离多数据源组件的工作方法,其特征在于:
在SQL语句执行场景中,通过拦截语句,并依据数据源组内的读写数据源信息,进行数据源切换具体包括以下步骤:
步骤1:通过 MyBatis 拦截器,拦截所要执行的语句,包括:新增、插入、更新与删除语句;
步骤2:从缓存中读取数据源组配置信息,确定读数据源与写数据源;
步骤3:解析获取到的SQL语句,从中解析出语句类型与指定数据源信息;
步骤4:如果发现指定数据源,则执行“指定数据源”策略;
步骤5:如果没有发现指定数据源,则进一步判定语句类型;如果语句类型是查询,则执行“读数据源”策略;如果语句类型是插入、新增、更新、函数或存储过程,则执行“写数据源”策略;
步骤6:依据相应的数据源策略,把当前线程的数据源切换到所要求的数据源;
步骤7:在切换后的数据源环境下,执行当前语句;
步骤8:语句执行后,清空当前线程数据源,恢复为切换前的状态。
6.一种计算机存储介质,其特征在于,包括计算机指令,当所述计算机指令在电子设备上运行时,使得所述电子设备执行如权利要求1-5任一项所述的读写分离多数据源组件或其工作方法。
7.一种读写分离多数据源组件的实现系统,其特征在于,包括存储器、处理器,所述存储器上存储有实现权利要求1-5任一项所述的读写分离多数据源组件或其工作方法的计算机指令,所述处理器在运行时执行存储器上存储的计算机指令。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111114158.8A CN113835690A (zh) | 2021-09-23 | 2021-09-23 | 读写分离多数据源组件及其工作方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202111114158.8A CN113835690A (zh) | 2021-09-23 | 2021-09-23 | 读写分离多数据源组件及其工作方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113835690A true CN113835690A (zh) | 2021-12-24 |
Family
ID=78969265
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202111114158.8A Pending CN113835690A (zh) | 2021-09-23 | 2021-09-23 | 读写分离多数据源组件及其工作方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113835690A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117251500A (zh) * | 2023-11-20 | 2023-12-19 | 深圳市雁联计算系统有限公司 | 一种数据库动态读写分离的系统及方法 |
-
2021
- 2021-09-23 CN CN202111114158.8A patent/CN113835690A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117251500A (zh) * | 2023-11-20 | 2023-12-19 | 深圳市雁联计算系统有限公司 | 一种数据库动态读写分离的系统及方法 |
CN117251500B (zh) * | 2023-11-20 | 2024-02-09 | 深圳市雁联计算系统有限公司 | 一种数据库动态读写分离的方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11176140B2 (en) | Updating a table using incremental and batch updates | |
US8286127B2 (en) | Mirrored file system | |
US8402435B1 (en) | Systems and methods for organizing source code | |
US10635666B2 (en) | System, method and device for index compilation to optimize index usage | |
CN103984582A (zh) | 一种热更新方法和装置 | |
CA2801573A1 (en) | Dynamically loading graph-based computations | |
RU2008122968A (ru) | Оптимизация операций программной транзакционной памяти | |
CN103092970A (zh) | 一种数据库操作方法及设备 | |
US10466985B2 (en) | Hybrid deoptimization mechanism for class hierarchy analysis | |
US7716213B2 (en) | Apparatus, system, and method for efficiently supporting generic SQL data manipulation statements | |
US20050028148A1 (en) | Method for dynamic recompilation of a program | |
CN113220669B (zh) | 业务数据的处理方法、装置及电子设备 | |
AU2014262225A1 (en) | Dynamically loading graph-based computations | |
CN113835690A (zh) | 读写分离多数据源组件及其工作方法 | |
CN113946628A (zh) | 一种基于拦截器的数据同步方法及装置 | |
CN113448977A (zh) | 基于数据库Binlog的分布式缓存更新方法及装置 | |
CN109558121A (zh) | 接口驱动程序的开发方法、装置、设备及存储介质 | |
US7707565B2 (en) | Method for consistent and efficient management of program configuration and customizing data | |
CN116955393A (zh) | 一种数据处理方法、装置、电子设备及存储介质 | |
CN113821557B (zh) | Web页面与后端进行数据交互的方法 | |
CN111142848A (zh) | 一种软件程序编译方法、执行方法及装置 | |
CN111984662B (zh) | 批量更新数据库的方法及装置 | |
US11194702B2 (en) | History based build cache for program builds | |
US7685188B2 (en) | Automated generation of computer-executable compensation procedures for previously executed methods | |
CN112817931A (zh) | 一种增量版本文件的生成方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |