技术领域
[0001] 本
发明涉及计算机技术领域,具体涉及一种双数据源之间的双向同步数据系统。
背景技术
[0002] 随着网络技术的发展, 单一数据源已经不能满足很多业务场景和业务系统的需求, 随着互联网的发展, 用户数据量越来越大,
软件系统都在往分布式的方向发展, 单一数据源很多场合都不能满足需求, 所以
数据库的也在向多个数据源趋势发展。特别是
电子商务
网站, 电商平台系统的数据源和后台管理系统的数据源是不同的, 但是虽然是双数据源, 如果两个数据源之间有很多数据是需要共享且实时保持一致的, 比如商品数据,商品价格, 商品图片, 商品
颜色尺寸, 商品性能等等, 如果这些需要共享的数据没有同步, 会导致两个数据源之间的这部分共享数据有所差异, 从而导致不可预知的后果, 所以实时同步双数据源之间部分共享数据, 就成为了亟待解决的问题。
[0003] 目前,
现有技术中能实现同步数据方法中, 缺点都显而易见, 比如使用数据库主从复制, 缺点是把所有数据全部同步, 这样是不合理的, 因为两个系统数据源之间有很多数据是不需要保持一致的, 只需要少部分数据保持一致即可. 再比如, 有些数据同步策略, 在同步数据时, 需要先将第一业务系统停止服务, 才能将第一业务系统数据源的数据同步到第二业务系统数据源中, 这样就必然导致第一业务系统的服务中断, 这样是不合理的。
发明内容
[0004] 本发明提出的一种双数据源之间的双向同步数据系统,可解决单一数据源很多场合都不能满足需求的技术问题。
[0005] 为实现上述目的,本发明采用了以下技术方案:一种双数据源之间的双向同步数据系统,基于计算机设备,用于第一数据源、第一业务系统与第二数据源、第二业务系统之间;
包括以下模
块:
模型对象模块,用于封装
请求参数, 封装响应参数,以便于对外提供服务
接口时, 实现请求和响应的标准化;
实
体模型模块:包括两大类:一是第一数据源的表结构对应的实体模型, 作用是让第一数据源的每张表都会有对应实体类;二是第二数据源的表结构对应的实体模型, 作用是让第二数据源的每张表都会有对应实体类;
公用工具类模块:用于实现动态
感知获取所传入的数据类型, 从而自动匹配到对应的数据表中进行增删改查操作;
双数据源配置模块:包括 SpringBoot配置文件配置两个数据源的连接信息, 还包括双数据源配置类;
interface接口模块:包括第一数据源的interface接口和第二数据源的interface接口;所述第一数据源的interface接口和第二数据源的interface接口都是注册到zookeeper注册中心, 成为对外提供服务的dubbo接口, 供外部调用;
业务逻辑处理service层模块:包括第一数据源的service层和第二数据源的service层;
dao层模块:包括, 第一数据源的mapper接口, 第二数据源的mapper接口, 第一数据源的mapper.xml映射文件, 第二数据源的mapper.xml映射文件。
[0006] 进一步的,所述模型对象模块包括请求参数模型,响应参数模型,常量枚举模型。
[0007] 进一步的,所述公用工具类模块: 包括: ObjectUtil类 和 BeanHump类;其中: ObjectUtil类作用是通过反射机制获取所传来的对象到底是属于第一数据源还是第二数据源, 并且能获取属性类型和属性名;
其中: BeanHump类作用是通过反射机制获取所传来的对象对应的注解, 并且通过
驼峰转换
算法, 获取所传来对象的各个属性和表中的各个字段之间的意义对应关系。
[0008] 进一步的,所述双数据源配置类包括:第一数据源配置类:根据SpringBoot配置文件配置第一数据源的连接信息, 创建出与第一数据源配置对应的DataSource对象, SqlSessionFactory对象,
DataSourceTransactionManager对象, SqlSessionTemplate对象. 其中DataSourceTransactionManager对象能够对数据源的事务进行控制和管理, 如果增删改查有异常, 使用DataSourceTransactionManager对象进行事务回滚, 保证数据安全性和一致性;
第二数据源配置类:根据SpringBoot配置文件配置第二数据源的连接信息, 创建出与第二数据源配置对应的DataSource对象, SqlSessionFactory对象,
DataSourceTransactionManager对象, SqlSessionTemplate对象;其中DataSourceTransactionManager对象能够对数据源的事务进行控制和管理, 如果增删改查有异常, 使用DataSourceTransactionManager对象进行事务回滚, 保证数据安全性和一致性。
[0009] 进一步的,业务逻辑处理service层模块处理步骤包括:首先通过公用工具类模块中ObjectUtil类和BeanHump类封装的方法获取 传来的对象的注解,从而获取它的表名, 从而程序就知道操作哪张表;
然后通过公用工具类模块中ObjectUtil类和BeanHump类封装的方法获取 传来的对象的属性名和属性值, 在通过驼峰转换方法映射到数据源的表中;
最后从调用dao层的mapper接口, 如果是简单的增删改查操作, 直接自动使用通用Mapper的底层方法即可,而如果是多表关联操作,需要使用mapper.xml映射文件中手写sql语句。
[0010] 由上述技术方案可知,本发明的一种双数据源之间的双向同步数据系统, 将同步数据的接口, 注册到zookeeper注册中心, 成为dubbo接口, 为其他分布式系统提供服务接口; 其中正向同步接口为 当第一数据源对应的第一业务系统需要将部分共享数据同步到第二数据源时, 第一业务系统需要调用本发明装置在dubbo提供的正向同步接口, 在本发明装置内部运行程序, 将数据同步到第二数据源中, 然后第二数据源的同步过来的数据就可以为第二业务系统提供数据服务了。而反向同步接口为当第二数据源对应的第二业务系统需要将部分共享数据同步到第一数据源时, 第二业务系统需要调用本发明装置在dubbo提供的反向同步接口, 在本发明装置内部运行程序, 将数据同步到第一数据源中, 然后第一数据源的同步过来的数据就可以为第一业务系统提供数据服务了。其中消息队列同步数据为同步数据也可以不使用dubbo接口来实现, 同步数据也可以使用消息队列的方式进行同步数据, 本发明的同步数据装置, 消息生产者将同步数据的消息推送到消息队列中, 消息消费者实时监听消息并从消息队列中取出同步消息, 然后将同步数据同步到
指定的数据源中, 从而实现双数据源之间的同步数据。
[0011] 本发明的双数据源之间的双向同步数据系统具有以下有益效果:(1)本发明对双数据源之间某些需要共享的部分数据 实现双向同步,当然本发明也可以双数据源之间所有数据都实现双向同步;
(2)本发明可以实时同步, 保证时效性. 本发明不需要先暂停第一业务系统服务, 同步数据后再启动第一业务系统服务. 所以本发明提高了同步效率;
(3)本发明使用安全
锁机制, 保证数据的安全性;
(4)本发明采用事务控制的方式,保证双数据源之间的共享数据的一致性和安全性;
(5)本发明装置可以使用dubbo接口模式来同步数据. 将同步数据的接口注册到zookeeper, 对外开放了dubbo服务接口, 方便其他调用者调用本发明装置的同步数据的接口服务;
(6)本发明装置也可以使用消息队列模式来同步数据, 利用消息生产者 和 消息消费者两者之间的配合实现同步数据;
(7)本发明装置动态感知获取所传入的数据类型, 从而自动匹配到对应的数据表中进行增删改查操作。
附图说明
[0012] 图1是本发明的结构原理图;图2是本发明实例1的工作原理图;
图3是本发明
实施例2的工作原理图。
具体实施方式
[0013] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。
[0014] 如图1所示,本发明实施例的双数据源之间的双向同步数据系统通过将同步数据的接口, 注册到zookeeper注册中心, 成为dubbo接口, 为其他分布式系统提供服务接口;其中,
正向同步接口: 当第一数据源对应的第一业务系统需要将部分共享数据同步到第二数据源时, 第一业务系统需要调用本发明装置在dubbo提供的正向同步接口, 在本发明装置内部运行程序, 将数据同步到第二数据源中, 然后第二数据源的同步过来的数据就可以为第二业务系统提供数据服务了.
反向同步接口: 当第二数据源对应的第二业务系统需要将部分共享数据同步到第一数据源时, 第二业务系统需要调用本发明装置在dubbo提供的反向同步接口, 在本发明装置内部运行程序, 将数据同步到第一数据源中, 然后第一数据源的同步过来的数据就可以为第一业务系统提供数据服务了.
消息队列同步数据: 同步数据也可以不使用dubbo接口来实现, 同步数据也可以使用消息队列的方式进行同步数据, 本发明的同步数据装置, 消息生产者将同步数据的消息推送到消息队列中, 消息消费者实时监听消息并从消息队列中取出同步消息, 然后将同步数据同步到指定的数据源中, 从而实现双数据源之间的同步数据。
[0015] 实施例1:如图2所示,本实施例所述的双数据源之间的双向同步数据系统,包括:以下模块:
(1)模型对象模块: 包括:请求参数模型, 响应参数模型, 常量枚举模型. 该模块主要负责: 封装请求参数, 封装响应参数. 以便于对外提供服务接口时, 实现请求和响应的标准化.
(2)实体模型模块: 实体模型分为两大类: 一是第一数据源的表结构对应的多个实体模型, 作用是让第一数据源的每张表都会在本发明装置中都有对应实体类. 二是第二数据源的表结构对应的多个实体模型, 作用是让第二数据源的每张表都会在本发明装置中都有对应实体类. 更加方便在本实施例同步数据装置 能通过实体类来操作两个数据源中的表数据. 已达到同步数据的目的.
(3)公用工具类模块: 包括: ObjectUtil类 和 BeanHump类,
其中: ObjectUtil类作用是通过反射机制获取所传来的对象到底是属于第一数据源还是第二数据源, 并且能获取属性类型和属性名等等.
其中: BeanHump类作用是通过反射机制获取所传来的对象对应的注解, 并且通过驼峰转换算法, 获取所传来对象的各个属性和表中的各个字段之间的意义对应关系.本模块能够实现: 动态感知获取所传入的数据类型, 从而自动匹配到对应的数据表中进行增删改查操作. 非常智能化.
(4)双数据源配置模块: 本模块包括: SpringBoot配置文件配置两个数据源的连接信息, 还包括双数据源配置类.
进一步的:第一数据源配置类: 根据SpringBoot配置文件配置第一数据源的连接信息, 创建出与第一数据源配置对应的DataSource对象, SqlSessionFactory对象, DataSourceTransactionManager对象, SqlSessionTemplate对象. 其中DataSourceTransactionManager对象能够对数据源的事务进行控制和管理, 如果增删改查有异常, 可以使用DataSourceTransactionManager对象进行事务回滚, 保证数据安全性和一致性. 值得注意的是: 使用@Primary注解将第一数据源设置为主数据源.第二数据源配置类: 根据SpringBoot配置文件配置第二数据源的连接信息, 创建出与第二数据源配置对应的DataSource对象, SqlSessionFactory对象,
DataSourceTransactionManager对象, SqlSessionTemplate对象. 其中DataSourceTransactionManager对象能够对数据源的事务进行控制和管理, 如果增删改查有异常, 可以使用DataSourceTransactionManager对象进行事务回滚, 保证数据安全性和一致性. 指的注意的是: 第二数据源配置类不加@Primary注解, 是从数据源.(5)interface接口模块: 本模块包括: 第一数据源的interface接口 和 第二数据源的interface接口. 将来这些interface接口都是注册到zookeeper注册中心, 成为对外提供服务的dubbo接口, 供外部调用.
(6)业务逻辑处理service层模块: 本模块包括: 第一数据源的service层 和 第二数据源的service层.
首先通过公用工具类模块中ObjectUtil类和BeanHump类封装的方法获取 传来的对象的注解,从而获取它的表名, 从而程序就知道操作哪张表.
然后通过公用工具类模块中ObjectUtil类和BeanHump类封装的方法获取 传来的对象的属性名和属性值, 在通过驼峰转换方法映射到数据源的表中.
最后从调用dao层的mapper接口, 如果是简单的增删改查操作, 直接自动使用通用Mapper的底层方法即可,而如果是多表关联操作, 需要使用mapper.xml映射文件中手写sql语句.
如上所述, 由于使用了ObjectUtil类和BeanHump类封装的方法, 从而实现动态感知获取所传入的数据类型, 从而自动匹配到对应的数据表中进行增删改查操作. 非常智能化。
[0016] (7)dao层模块: 本模块包括, 第一数据源的mapper接口, 第二数据源的mapper接口, 第一数据源的mapper.xml映射文件, 第二数据源的mapper.xml映射文件。
[0017] 如果是简单的增删改查操作, 直接自动使用通用Mapper的底层方法即可,而如果是多表关联操作, 需要使用mapper.xml映射文件中手写sql语句。
[0018] 实施例2:如图3所示,本实施例设计了一种双数据源之间的双向同步数据系统, 基于SpringBoot
框架和Mybatis技术, 同时也基于Rabbit消息队列技术, 该装置包括以下几个模块构成:
(1)模型对象模块: 包括:请求参数模型, 响应参数模型, 常量枚举模型. 该模块主要负责: 封装请求参数, 封装响应参数. 以便于对外提供服务接口时, 实现请求和响应的标准化.
(2)实体模型模块: 实体模型分为两大类: 一是第一数据源的表结构对应的多个实体模型, 作用是让第一数据源的每张表都会在本发明装置中都有对应实体类. 二是第二数据源的表结构对应的多个实体模型, 作用是让第二数据源的每张表都会在本发明装置中都有对应实体类. 更加方便在本实施例同步数据装置 能通过实体类来操作两个数据源中的表数据. 已达到同步数据的目的.
(3)公用工具类模块: 包括: ObjectUtil类 和 BeanHump类,
其中: ObjectUtil类作用是通过反射机制获取所传来的对象到底是属于第一数据源还是第二数据源, 并且能获取属性类型和属性名等等.
其中: BeanHump类作用是通过反射机制获取所传来的对象对应的注解, 并且通过驼峰转换算法, 获取所传来对象的各个属性和表中的各个字段之间的意义对应关系.本模块能够实现: 动态感知获取所传入的数据类型, 从而自动匹配到对应的数据表中进行增删改查操作. 非常智能化.
(4)双数据源配置模块: 本模块包括: SpringBoot配置文件配置两个数据源的连接信息, 还包括双数据源配置类. 进一步的:
第一数据源配置类: 根据SpringBoot配置文件配置第一数据源的连接信息, 创建出与第一数据源配置对应的DataSource对象, SqlSessionFactory对象,
DataSourceTransactionManager对象, SqlSessionTemplate对象. 其中DataSourceTransactionManager对象能够对数据源的事务进行控制和管理, 如果增删改查有异常, 可以使用DataSourceTransactionManager对象进行事务回滚, 保证数据安全性和一致性. 值得注意的是: 使用@Primary注解将第一数据源设置为主数据源.第二数据源配置类: 根据SpringBoot配置文件配置第二数据源的连接信息, 创建出与第二数据源配置对应的DataSource对象, SqlSessionFactory对象,
DataSourceTransactionManager对象, SqlSessionTemplate对象. 其中DataSourceTransactionManager对象能够对数据源的事务进行控制和管理, 如果增删改查有异常, 可以使用DataSourceTransactionManager对象进行事务回滚, 保证数据安全性和一致性. 指的注意的是: 第二数据源配置类不加@Primary注解, 是从数据源.(5)业务逻辑处理service层模块: 本模块包括: 第一数据源的service层 和 第二数据源的service层.
首先通过公用工具类模块中ObjectUtil类和BeanHump类封装的方法获取 传来的对象的注解,从而获取它的表名, 从而程序就知道操作哪张表.
然后通过公用工具类模块中ObjectUtil类和BeanHump类封装的方法获取 传来的对象的属性名和属性值, 在通过驼峰转换方法映射到数据源的表中.
最后从调用dao层的mapper接口, 如果是简单的增删改查操作, 直接自动使用通用Mapper的底层方法即可,而如果是多表关联操作, 需要使用mapper.xml映射文件中手写sql语句.
如上所述, 由于使用了ObjectUtil类和BeanHump类封装的方法, 从而实现动态感知获取所传入的数据类型, 从而自动匹配到对应的数据表中进行增删改查操作. 非常智能化.
(6)dao层模块: 本模块包括, 第一数据源的mapper接口, 第二数据源的mapper接口, 第一数据源的mapper.xml映射文件, 第二数据源的mapper.xml映射文件.如果是简单的增删改查操作, 直接自动使用通用Mapper的底层方法即可,而如果是多表关联操作, 需要使用mapper.xml映射文件中手写sql语句.
(7)rabbitMQ消息队列处理模块: 使用消息队列的方式进行同步数据, 本发明的同步数据装置, 消息生产者将同步数据的消息推送到消息队列中, 消息消费者实时监听消息并从消息队列中取出同步消息, 然后将同步数据同步到指定的数据源中, 从而实现双数据源之间的同步数据。
[0019] 综上所述,本发明实施例具备以下特点:(1)对双数据源之间某些需要共享的部分数据 实现双向实时同步, 而且可以实时同步, 保证时效性;
(2)使用安全锁机制, 保证数据的安全性;
(3)采用事务控制的方式,保证双数据源之间的共享数据的一致性;
(4)本发明装置将同步数据的接口注册到zookeeper, 对外开放了dubbo服务接口, 方便其他调用者调用本发明装置的同步数据的接口服务.
(5)动态感知获取所传入的数据类型, 从而自动匹配到对应的数据表中进行增删改查操作。
[0020] 以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行
修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。