分片数据库访问方法及数据库系统的制作方法

文档序号:6491903阅读:210来源:国知局
分片数据库访问方法及数据库系统的制作方法
【专利摘要】本发明公开了一种分片数据库访问方法及数据库系统。所述分片数据库访问方法用于Mybatis和Spring构架,包括以下步骤:1、基于一数据库事务通过Spring配置文件定位待访问的数据库;2、分别为每个待访问的数据库建立一访问线程;3、Mybatis的数据库操作接口通过各个访问线程操作各个访问线程关联的待访问的数据库,收集各个访问线程的反馈数据并生成执行结果;4、Spring的事务管理接口基于所述数据库操作接口生成的执行结果检测所述数据库事务是否执行成功,并执行相应地提交和回滚。本发明还提供了一种使用所述分片数据库访问方法的数据库系统。本发明利用现有的框架,通过路由策略来实现分页数据库的操作。
【专利说明】分片数据库访问方法及数据库系统
【技术领域】
[0001]本发明涉及一种分片数据库访问方法及数据库系统,特别是涉及一种适用于Mybatis和Spring框架的分片数据库访问方法及数据库系统。
【背景技术】
[0002]数据库的扩展是一个永恒的话题。对于传统的关系数据库,采用的是纵向扩展(ScaleUp)的方式,即买更好的机器添加更多的资源来取得更好的性能(如硬件升级、更快更多的CPU (中央处理器)、更大的内存、更多更大的磁盘等)。关系数据库通过ScaleUp方式已在传统的企业应用环境中统治了将近三十多年。但是近年来随着数据量的暴增尤其是云计算模式的出现,这种扩展模式对于某些应用已经不太适合,这时便出现了横向扩展(ScaleOut)模式,sharding就是其中一种。
[0003]sharding是把数据库Scale Out到多个物理节点上的一种有效的方式。Shard这个词的意思是“碎片”。如果将一个数据库当作一块大玻璃,将这块玻璃打碎,那么每一小块都称为数据库的碎片。将整个数据库打碎的过程就叫做sharding,可以翻译为分片。
[0004]形式上,sharding可以简单定义为将大数据库分布到多个物理节点上的一个分区方案。每一个分区包含数据库的某一部分,称为一个shard,分区方式可以是任意的,并不局限于传统的水平分区和垂直分区。系统中需要有服务器进行查询路由转发,负责将查询转发到包含该查询所访问数据的shard或shards节点上去执行。
[0005]而目前的Mybatis系统还主要使用单数据库架构,所以采用的是纵向扩展的方式,因而很多基于Mybatis系统面临着大数据量、高并发的考验,它们非常需要应用sharding来缓解数据库的巨大压力。但是成熟的基于Mybatis的sharding框架却还没有出现。

【发明内容】

[0006]本发明要解决的技术问题是为了克服现有技术中的Mybatis系统不适用于sharding框架的多数据库系统的缺陷,提供一种分片数据库访问方法及其数据库系统,利用现有的Mybatis和Spring框架,通过路由策略来实现sharding数据库的操作。
[0007]本发明是通过下述技术方案来解决上述技术问题的:
[0008]本发明提供了一种分片数据库访问方法,适用于Mybatis和Spring框架,其特点是,所述分片数据库访问方法包括以下步骤:
[0009]S1、基于一数据库事务通过Spring配置文件定位待访问的数据库;
[0010]S2、分别为每个待访问的数据库建立一访问线程;
[0011]S3、Mybatis的数据库操作接口通过各个访问线程操作与各个访问线程关联的待访问的数据库,收集各个访问线程的反馈数据并生成执行结果;
[0012]S4,Spring的事务管理接口基于Mybatis的数据库操作接口生成的执行结果检测所述数据库事务是否执行成功,若是,所述Spring的事务管理接口向各个待访问的数据库提交事务,否则所述Spring的事务管理接口向各个待访问的数据库回滚事务。
[0013]本发明中利用Mybatis和Spring框架实现多数据库的访问和操作,从而实现分片数据库的事务提交和回滚。其中利用Spring进行分片数据库的事务具体提交和回滚,利用Mybatis实现对各个数据库的具体操作。
[0014]其中所述MyBatis是一个基于Java (—种编程语言)的持久层框架。其提供的持久层框架是一种支持普通SQL (结构化查询语言)查询,存储过程和高级映射的优秀持久层框架。
[0015]所述Spring是一个开源框架,它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean (—种JAVA语言写成的可重用组件)来完成以前只可能由EJB(Enterprise JavaBean,—种企业的JAVA可重用组件)完成的事情。
[0016]其中所述Spring配置文件为现有的Spring框架中设置路由信息或路由类的文件,所以本发明中不再详细赘述。
[0017]此外本发明中所述数据库事务是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的原子性、一致性、隔离性和持久性的属性。也就是说,本发明中的数据库事务是指对各个待访问的数据库的操作的具体的集合,仅在所有操作都成功时,才对所述各个待访问的数据库的具体操作内容进行更新。若失败,则将所述各个待访问的数据库的具体操作内容进行回滚还原,从而保证各个数据库内容的确定。
[0018]较佳地,所述步骤SI为:
[0019]S11、基于所述数据库事务通过Spring配置文件的路由信息或路由类来定位待访问的数据库。
[0020]S12、基于所述待访问的数据库,关联Mybatis Mapper文件的statement所需要访问的Spring配置文件的路由信息或路由类。
[0021]其中所述statement为Mybatis Mapper文件所配置的用于从Spring配置文件待访问的数据库的路由策略的路由信息或路由类。本发明中利用Mybatis框架现有的Mybatis Mapper文件中的statement的路由策略来确定在整个分片数据库中待访问的数据库。
[0022]较佳地,在所述步骤SI之前还包括以下步骤:
[0023]在所述Spring配置文件中配置从数据库。
[0024]本发明中利用现有Spring配置文件的读写分离技术,通过设置从数据库(SPslave数据库)的方式,将数据库的读操作和数据库的增删改操作分散到不同的数据库中,从而提闻读与数据的效率。
[0025]较佳地,所述步骤S3为:
[0026]S31、所述Mybatis的数据库操作接口通过各个访问线程操作与各个访问线程关联的待访问的数据库,并收集各个访问线程的反馈数据;
[0027]S32、所述Mybatis的数据库操作接口基于所述反馈数据通过SQL操作生成执行结
果O[0028]优选地,所述SQL操作为求和、查询最大值、查询最小值、计数或排序等。
[0029]较佳地,步骤S4中还包括以下步骤:
[0030]所述Spring的事务管理接口与各个待访问的数据库建立数据链接。
[0031]优选地,所述步骤S2中还包括以下步骤:
[0032]所述Spring的事务管理接口与各个待访问的数据库通过LazyConnectionDataSourceProxy 链接。
[0033]其中所述LazyConnectionDataSourceProxy在Spring架构中用于延迟获取数据库连接,即只有在真正创建Statement等操作数据库的数据链接时才获取实际的连接。
[0034]本发明通过在上述步骤S4和步骤S2中用LazyConnectionDataSourceProxy建立链接,避免了在开启事务时创建过多的连接,只有在需要对数据库进行实际操作时,才建立到数据库的连接,从而减少无谓的数据库连接开销。
[0035]较佳地,所述步骤S4之后还包括以下步骤:
[0036]S5、所述待访问的数据库之间数据同步。
[0037]优选地,所述步骤S5为:
[0038]所述待访问的数据库通过Replication机制同步数据。
[0039]本发明中所述数据库之间通过现有数据库中自带的Replication机制实现数据的同步。所以本发明不再对所述R印Iication机制进行详细地描述。此外任何数据库的数据同步机制均可应用于本发明的数据库同步中。
[0040]本发明还提供了一种数据库系统,其特点是,所述数据库系统包括一服务器和一输入装置,其中所述服务器具有一个或多个数据库,所述输入装置使用Mybatis和Spring框架,并通过如上所述的分片数据库访问方法访问所述数据库。
[0041]较佳地,所述数据库系统还包括一 ID (身份识别)生成器,所述ID生成器为每个所述数据库生成一 ID识别信息,其中各个ID识别信息均是唯一的。
[0042]为了避免数据库的ID出现重复,本发明提供了 ID生成器来保证分布式环境下ID的唯一性和生成效率。其中它既可以生成字符串型和数字型ID,其中数字型ID支持OracIe(甲骨文公司的数据库)、MySQL数据库(一个中、小型关系型数据库),例如ID生成器从数据库中获取一段ID后放进内存中,使用的时候先从内存中获取ID,如果内存中的ID用完了再向数据库中获取下一段ID。
[0043]较佳地,所述服务器还包括一 SQL日志,所述SQL日志记录如上所述分片数据库访问方法中执行超时的SQL语句。
[0044]本发明中还通过所述SQL日志记录执行超时的所述分片数据库访问方法的SQL语句,从而便于找出消耗数据库资源的具体的SQL语句。
[0045]优选地,所述数据库为分页数据库。
[0046]本发明中所述数据库可以是单数据库物理分页或者多数据库逻辑分页等方式的分页数据库。
[0047]较佳地,所述分页数据库均包括一缓存,所述缓存用于存储通过如上所述的分片数据库访问方法访问所述分页数据库的各个分页的执行结果。本发明中通过使用缓存来提高分页数据库中分页的效率
[0048]在符合本领域常识的基础上,上述各优选条件,可任意组合,即得本发明各较佳实例。
[0049]本发明的积极进步效果在于:
[0050]本发明的分片数据库访问方法及其数据库系统,利用现有的Mybatis和Spring框架,通过路由策略来实现sharding数据库的操作。
[0051]同时,本发明还通过Spring的事务管理接口和Mybatis对数据库的操作的结合,实现了 sharding数据库的多数据库的提交和回滚,保证了结果的正确性。
[0052]此外还进一步的利用Spring架构的LazyConnectionDataSourceProxy来减少无谓的数据库连接开销。
[0053]最后,本发明还通过ID生成器和SQL日志来保证数据库的唯一标识以及找出消耗数据库资源的具体的SQL语句。
【专利附图】

【附图说明】
[0054]图1为本发明的数据库系统的较佳实施例的结构示意图。
[0055]图2为本发明的较佳实施例的数据库访问的流程图。
【具体实施方式】
[0056]下面通过实施例的方式进一步说明本发明,但并不因此将本发明限制在所述的实施例范围之中。
[0057]本实施例的数据库系统采用Mybatis和Spring框架,实现对sharding数据库的操作,即实现了数据库访问的可配置性。能够方便的通过配置文件来配置数据库访问路由策略。而且使得开发数据库应用的透明性。此外还抑制了数据访问的效率很可能会随着数据库的增加而下降的问题。并且保证了数据访问的正确性。即在多数据库的事务操作实现多库提交或者多库回滚,保证数据的一致性和正确性。使得正常使用所述多数据库的求和、计数、查询最大值、查询最小值、排序、分页等SQL操作。
[0058]因此如图1所示,本实施例的数据库系统包括一服务器1、一输入装置2和一 ID生成器3。
[0059]其中本实施例中所述服务器中包括2个数据库(图中未显示),其中所述服务器中包括的数据库的数量是任意的,而不仅限于本实施例的2个数据库。其中若所述数据库为分页数据库,则本实施例中可以通过对Mybatis和Spring框架中配置文件的修改来提高分页的效率。
[0060]具体的说,可以采用如下代码:
[0061]
<plugin interceptor="scm.mybatis.sharding.plugin.Paginationinterceptor">[0062]<!-- 数据库类型,如果是 Oracle 就写成scm.mybatis.sharding.plugin.0racIeDialect ~>
〈propertyname="dialectCiass"
value-'scm.mybatis.sharding.plugin.MySQLDialect"/>
<!--是否启用sharding分页,单数据库时写成false--〉
〈property name="isSharding" value="true"/>
<!-sharding分页特有属性,固定取多少行数据-->
〈property name="limitNumber' value="2000'7>
</plugin>
<bean class=Mscm.mybatis.sharding.piugin.PaginationUtil">
〈propeity name="pageCache">
<!—本地缓存。本框架也内置Memcache缓存-->
<bean class="scm.mybatis.sharding.plugin丄ocalC.ache”〉.<!-缓存60秒过期-->
〈property name="expireSecond" value="60"></piOperty>
</bean>
<7property>
</bean>
<seiect id="getPageTest" resultMap="test">
select id,deai_couiU,sts,own_sign from dbs—test order by id
〈/select〉
List<TestDomain> tests = paginationUti1.doPage(this.getSqlSession(),statement, param, startlndex, recordCount,"testId",false);
[0063]上述代码中通过从Spring中获取paginationUtil,调用doPage方法,参数依次是sqlSession、Mapper文件中的statementID、参数、第几页、每页记录条数、排序属性名、是否降序。
[0064]上述代码可以看到若应用方的SQL中没有出现分页的语句,可以避免了 SQL和特定数据库的绑定,这是因为本实施例是通过PaginationInterceptor类作为Mybatis的插件,在执行SQL之前根据当前数据库类型,直接修改SQL语句(增加分页的SQL),然后再执行修改后的SQL从而实现分页的。如果采用现有方式进行分页,除了需要写访问多个数据库的代码外,分页的时候效率不高,也容易出错。
[0065]所述服务器I还包括一 SQL日志(图中未显示),所述SQL日志记录执行随所述2个数据库访问时超时的SQL语句,具体地说,就是记录执行超过指定时间的SQL语句,方便找出消耗数据库资源的statement语句。其中在执行数据库操作之前会先记录当前时间,执行完后和先前时间进行比较,如果时间间隔超过了应用方在配置文件中配置的超时时间,会在日志里记录SQL语句和执行时间信息。
[0066]所述ID生成器3用于为服务器I中的数据库各自生成一个唯一的ID识别信息,而且各个数据库通过各自的ID识别信息进行区别,具体地说,就是为所述2个数据库各自生成一个ID识别信息,这2个ID识别信息均是唯一的,从而通过所述ID识别信息就可以区分所述2个数据库。
[0067]其中所述ID生成器3可以利用Spring配置文件实现,例如采用如下代码来实现ID生成器3:
[0068]在Spring配置文件中加入下述代码:
[0069]
【权利要求】
1.一种分片数据库访问方法,用于Mybatis和Spring构架,其特征在于,所述分片数据库访问方法包括以下步骤: 51、基于一数据库事务通过Spring配置文件定位待访问的数据库; 52、分别为每个待访问的数据库建立一访问线程; 53、Mybatis的数据库操作接口通过各个访问线程操作与各个访问线程关联的待访问的数据库,收集各个访问线程的反馈数据并生成执行结果; S4,Spring的事务管理接口基于Mybatis的数据库操作接口生成的执行结果检测所述数据库事务是否执行成功,若是,所述Spring的事务管理接口向各个待访问的数据库提交事务,否则所述Spring的事务管理接口向各个待访问的数据库回滚事务。
2.如权利要求1所述的分片数据库访问方法,其特征在于,所述步骤SI为: 511、基于所述数据库事务通过Spring配置文件的路由信息或路由类来定位待访问的数据库; 512、基于所述待访问的数据库,关联MybatisMapper文件的statement所需要访问的Spring配置文件的路由信息或路由类。
3.如权利要求1所述的分片数据库访问方法,其特征在于,在所述步骤SI之前还包括以下步骤: 在所述Spring配置文件中配置从数据库。
4.如权利要求1所述的分片数据库访问方法,其特征在于,所述步骤S3为: 531、所述Mybatis的数据库操 作接口通过各个访问线程操作与各个访问线程关联的待访问的数据库,并收集各个访问线程的反馈数据; 532、所述Mybatis的数据库操作接口基于所述反馈数据通过SQL操作生成执行结果。
5.如权利要求4所述的分片数据库访问方法,其特征在于,所述SQL操作为求和、查询最大值、查询最小值、计数或排序。
6.如权利要求1所述的分片数据库访问方法,其特征在于,步骤S4中还包括以下步骤: 所述Spring的事务管理接口与各个待访问的数据库建立数据链接。
7.如权利要求6所述的分片数据库访问方法,其特征在于,所述步骤S2中还包括以下步骤: 所述Spring的事务管理接口与各个待访问的数据库通过LazyConnectionDataSourceProxy 链接。
8.如权利要求1所述的分片数据库访问方法,其特征在于,所述步骤S4之后还包括以下步骤: S5、所述待访问的数据库之间数据同步。
9.如权利要求8所述的分片数据库访问方法,其特征在于,所述步骤S5为: 所述待访问的数据库通过Replication机制同步数据。
10.一种数据库系统,其特征在于,所述数据库系统包括一服务器和一输入装置,其中所述服务器具有一个或多个数据库,所述输入装置使用Mybatis和Spring框架,并通过如权利要求1-9中任一项所述的分片数据库访问方法访问所述数据库。
11.如权利要求10所述的数据库系统,其特征在于,所述数据库系统还包括一ID生成器,所述ID生成器为每个所述数据库生成一 ID识别信息,其中各个ID识别信息均是唯一的。
12.如权利要求10所述的数据库系统,其特征在于,所述服务器还包括一SQL日志,所述SQL日志记录如权利要求1-9中任一项所述分片数据库访问方法中执行超时的SQL语句。
13.如权利要求10-12中任一项所述的数据库系统,其特征在于,所述数据库为分页数据库。
14.如权利要求13所述的数据库系统,其特征在于,所述分页数据库均包括一缓存,所述缓存用于存储通过如权利要求1-9中任一项所述的分片数据库访问方法访问所述分页数据库的各个分页的 执行结果。
【文档编号】G06F17/30GK103853718SQ201210496069
【公开日】2014年6月11日 申请日期:2012年11月28日 优先权日:2012年11月28日
【发明者】郭清, 胡迪, 潘明国 申请人:纽海信息技术(上海)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1