spring、mybatis实现数据库多数据源和分布式事务

数据库锁和分布式锁

数据库的读和写如果分离,在多线程操作操作时会有线程安全问题。如果只加线程锁,在分布式程序中也是不安全的。这个时候可以使用数据库的悲观锁和乐观锁,也可以使用基于redis、zk等的分布式锁解决。

多数据源

就是在一个程序服务里面,需发连接多个数据库。

动态数据源

在多数据源的基础上,要实现数据源的动态切换。

这两种复杂系统的数据库联接有相关性,也有不同应用场景的区别。如要连接两个不同的业务库,一般会使用多数据源,如要动态切换不同数据源的相同业务库,会选择使用动态数据源。

分布式事务

要支持多数据源的事务,只能用JTA事务管理(没用过 -_-||),而且应用服务器还不能是Tomcat(一直在用tomcat,不想换-_-!!),头疼了。幸亏后面还有说,有第三方的实现支持JTA事务管理,一是JOTM,一是Atomikos。只要用了其中一个,还能继续用Tomcat。因为名字短,先考虑用JOTM。到官网一看,最后更新日期是2010年。。呃。。转向Atomikos

spring 多数据源配置

spring 多数据源配置一般有两种方案(基于多数据源和动态数据源原理):

1、在spring项目启动的时候直接配置两个不同的数据源,不同的sessionFactory。在dao 层根据不同业务自行选择使用哪个数据源的session来操作。

2、配置多个不同的数据源,使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源,有一个种是在拦截器里面根据不同的业务现切换到不同的datasource;有的会在业务层根据业务来自动切换。但这种方案在多线程并发的时候会出现一些问题,需要使用threadlocal等技术来实现多线程竞争切换数据源的问题。

本问主要介绍的是多数据源场景和分布式事务(Atomikos jta)的配置实现。

数据源和事务配置

--applicationContext-db.xml

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd" default-lazy-init="true">

数据库配置

init-method="init" destroy-method="close">

AND execution(* com.leimingtech.service.module..service.*.*(..))

AND execution(* com.leimingtech.extend.module..service.*.*(..))

AND execution(* com.leimingtech.gencode.service.*.*(..))" />

mybatis映射文件配置

--applicationContext-sqlmapping.xml

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd"

default-lazy-init="true">

Sql Mapping配置

classpath*:com/leimingtech/service/module/**/dao/mapper/*Mapper.xml

classpath*:com/leimingtech/extend/module/**/dao/mapper/*Mapper.xml

classpath*:mapper/**/*Mapper.xml

classpath*:com/leimingtech/service/es/**/dao/mapper/*Mapper.xml

com.leimingtech.service.module.**.dao.mapper;

com.leimingtech.extend.module.**.dao.mapper;

com.leimingtech.gencode.dao.mapper" />

以上是一些学习整理和配置笔记,希望对大家有帮助。有问题欢迎一起探讨……——……。下面是本人公众号,可加微信探讨。

聚焦程序猿的世界,探讨技艺,分享资源,侃谈生活……

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180622G1E95300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券