springboot整合atomikos—单体项目多数据源整合

最近管理后台增加了其他数据库的一些操作,如果只是简单的切换数据源的话使用动态数据源就可以实现,但动态数据源切换容易,加上事务处理就非常麻烦,seata是分布式事务的解决方案,管理后台一个单体服务也用不了,手动写事务处理又非常麻烦,所以这里用了atomikos做多数据源的整合方案。
这里只做代码展示,原理这块无外乎XA协议,这块可以看mysql的知识梳理中对事务的讲解。

注意点:每个数据源要配置单独的dao package和xml。

一、引入atomikos jar包

<parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.0.6.RELEASE</version>
</parent>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>

二、配置文件中配置数据源连接信息

spring:datasource:db1:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db1?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=falseusername: rootpassword: rootdb2:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db2?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=falseusername: rootpassword: rootdb3:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/db3?characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=falseusername: rootpassword: root

三、准备数据源配置文件

要注意一定要配置MapperScan,扫描每个数据库对应的dao和xml。

同样的配置,每个数据源配置一份。


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = "com.comm.dao.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class Db1DatabaseConfig {@Value("${spring.datasource.db1.driver-class-name}")private String driverClassName;@Value("${spring.datasource.db1.url}")private String url;@Value("${spring.datasource.db1.username}")private String username;@Value("${spring.datasource.db1.password}")private String password;@Bean(name = "db1DataSource")public DataSource dataSource() {MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();mysqlXADataSource.setUrl(url);mysqlXADataSource.setUser(username);mysqlXADataSource.setPassword(password);mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();xaDataSource.setXaDataSource(mysqlXADataSource);xaDataSource.setUniqueResourceName("db1DataSource");xaDataSource.setMaxPoolSize(20);xaDataSource.setMinPoolSize(3);return xaDataSource;}//配置数据源@Bean(name = "db1SqlSessionFactory")public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();//mapper.xml 的位置Resource[] resources = pathMatchingResourcePatternResolver.getResources("classpath*:mybatis-mapper/db1/*.xml");factoryBean.setMapperLocations(resources);factoryBean.setDataSource(dataSource);//防止pagehelper分页功能失效MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));factoryBean.setPlugins(new Interceptor[]{interceptor});return factoryBean.getObject();}@Bean(name = "db1SqlSessionTemplate")public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}}

四、准备transactionManager

import com.atomikos.icatch.jta.UserTransactionImp;
import com.atomikos.icatch.jta.UserTransactionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.jta.JtaTransactionManager;import javax.transaction.TransactionManager;
import javax.transaction.UserTransaction;@Configuration
public class TransactionManagerConfig {/*** 不管有多少个数据源只要配置一个 TransactionManager*/@Bean(name = "atomikosTransactionManager")public TransactionManager atomikosTransactionManager(){UserTransactionManager userTransactionManager = new UserTransactionManager();userTransactionManager.setForceShutdown(false);return userTransactionManager;}@Bean(name = "transactionManager")@DependsOn({"userTransaction", "atomikosTransactionManager"})public PlatformTransactionManager transactionManager() throws Throwable {UserTransaction userTransaction = userTransaction();TransactionManager atomikosTransactionManager = atomikosTransactionManager();return new JtaTransactionManager(userTransaction, atomikosTransactionManager);}@Bean(name = "userTransaction")public UserTransaction userTransaction() throws Throwable {UserTransactionImp userTransactionImp = new UserTransactionImp();userTransactionImp.setTransactionTimeout(10000);return userTransactionImp;}}

五、启动使用

和正常方法一样,在方法上加上@Transactional注解即可。不再演示了,atomikos的好处就是让你使用起来和单体服务中单个数据源一样,而且不用去额外搭建TM和注册中心等。

USING: com.atomikos.icatch.default_max_wait_time_on_shutdown = 922337203685477
USING: com.atomikos.icatch.allow_subtransactions = true
USING: com.atomikos.icatch.recovery_delay = 10000
USING: com.atomikos.icatch.automatic_resource_registration = true
USING: com.atomikos.icatch.oltp_max_retries = 5
USING: com.atomikos.icatch.client_demarcation = false
USING: com.atomikos.icatch.threaded_2pc = false
USING: com.atomikos.icatch.serial_jta_transactions = true
USING: com.atomikos.icatch.log_base_dir = ./
USING: com.atomikos.icatch.rmi_export_class = none
USING: com.atomikos.icatch.max_actives = 50
USING: com.atomikos.icatch.checkpoint_interval = 500
USING: com.atomikos.icatch.enable_logging = true
USING: com.atomikos.icatch.log_base_name = tmlog
USING: com.atomikos.icatch.max_timeout = 300000
USING: com.atomikos.icatch.trust_client_tm = false
USING: java.naming.factory.initial = com.sun.jndi.rmi.registry.RegistryContext
USING: com.atomikos.icatch.tm_unique_name = 172.17.170.113.tm
USING: com.atomikos.icatch.forget_orphaned_log_entries_delay = 86400000
USING: com.atomikos.icatch.oltp_retry_interval = 10000
USING: java.naming.provider.url = rmi://localhost:1099
USING: com.atomikos.icatch.force_shutdown_on_vm_exit = false
USING: com.atomikos.icatch.default_jta_timeout = 10000
Using default (local) logging and recovery...
db1DataSource: refreshed XAResource
db2DataSource: refreshed XAResource
db3DataSource: refreshed XAResource
022.06.17 16:00:43.388 INFO  org.springframework.transaction.jta.JtaTransactionManager 501 checkUserTransactionAndTransactionManager - Using JTA UserTransaction: com.atomikos.icatch.jta.UserTransactionImp@668a32a4
2022.06.17 16:00:43.389 INFO  org.springframework.transaction.jta.JtaTransactionManager 512 checkUserTransactionAndTransactionManager - Using JTA TransactionManager: com.atomikos.icatch.jta.UserTransactionManager@23b71d24
…………
Tomcat started on port(s): 9680 (http) with context path ''

springboot整合atomikos实践—单体项目多数据源整合相关推荐

  1. 项目整合atomikos数据源

    整合背景 公司用的是springboot项目,使用的是druid数据源. 原生spring的事务是不支持多数据源场景的,而后台大部分业务逻辑都会同时操作多个数据源,因此我们在业务逻辑里都是通过手动的方 ...

  2. SpringBoot一站式功能提供框架(一)整合MybatisPlus、整合Swagger Knif4j、整合Druid多数据源--柚子真好吃

    SpringBoot一站式功能提供框架(一)整合MybatisPlus.整合Swagger Knif4j.整合Druid多数据源--柚子真好吃 一.前言 二.功能描述 三.具体实现 四.开源地址 一. ...

  3. 披荆斩棘之springboot整合atomikos

    披荆斩棘之springboot整合atomikos 1.导入jar包 <dependency><groupId>org.springframework.boot</gro ...

  4. spring boot controller 初始化_基于 tyboot 快速初始化 springboot 单体项目

    基于 tyboot 快速初始化 springboot 单体项目 tyboot源码: gitee https://gitee.com/magintursh/tyboot github https://g ...

  5. 学习【瑞吉外卖①】SpringBoot单体项目

    视频链接:黑马程序员[Java 项目实战<瑞吉外卖>,轻松掌握 SpringBoot + MybatisPlus 开发核心技术] 资料链接:2022 最新版 Java学习 路线图>第 ...

  6. 将springboot单体项目部署到腾讯云服务器上

    前言 在服务器上运行springboot项目,需要有jdk环境,而此文的项目案例使用的数据库是mysql,所以也需要安装mysql,教程如下: CentOS7安装jdk8 CentOS7快速安装mys ...

  7. 学习【瑞吉外卖⑥】SpringBoot单体项目_手机验证码登录业务开发

    视频:[黑马程序员]Java 项目实战<瑞吉外卖>,轻松掌握 SpringBoot + MybatisPlus 开发核心技术 资料:2022 最新版 Java学习 路线图>第 5 阶 ...

  8. Easymall项目分布式拆分整合(四)

    Easymall项目分布式拆分整合(四) 目录 Easymall项目分布式拆分整合(四) 一.前端系统的搭建开发 一.搭建 1.maven骨架webapp 2.pom文件修改 1.parent的继承 ...

  9. 全程配图超清晰的Springboot权限控制后台管理项目实战第二期(Springboot+shiro+mybatis+redis)

    全程配图超清晰的Springboot权限控制后台管理项目实战第二期(Springboot+shiro+mybatis+redis) 众所周知,作为一个后端新手学习者,通过项目来学习,增长项目经验,是一 ...

最新文章

  1. 谷歌BERT预训练源码解析(二):模型构建
  2. 关于owner group others的测试
  3. 固定资产多提折旧问题
  4. mysql 类型解释_MySQL 数据类型说明解释
  5. 04_ClickHouse表引擎概述、MergeTree系列引擎、Log系列引擎、集成引擎、特定功能的引擎(学习笔记)
  6. Large-Scale Named Entity Disambiguation Based on Wikipedia Data
  7. python播放网络音乐_python使用Tkinter实现在线音乐播放器
  8. go实现区块链[3]-遍历区块链与数据库持久化
  9. html页面插歌,怎样在HTML播放器里插入歌曲
  10. 冰点还原精灵、影子系统区别哪个好
  11. 如何找回删除的文件?数据恢复,看这几个方法
  12. vue3 setup vetur报错 解决方案 vscode
  13. 2021年焊工(初级)复审考试及焊工(初级)模拟试题
  14. 如何培养孩子的阅读兴趣
  15. jsp代码中ArrayList函数提示“无法解释为类型”
  16. 如何把Windows10打造成Mac
  17. 网易云---手机验证码登录
  18. 讲座回顾丨5G的全新可能:基于Smart Edge Open和EdgeX构建5G MEC
  19. 上海市建筑标准规范合集
  20. 华硕飞行堡垒系列无线网经常显示“无法连接网络” || 一打开游戏就断网

热门文章

  1. 在线考试系统调查问卷
  2. 苹果6访问限制密码4位_浅谈打印机共享无法访问,您知道您的电脑为什么无法访问了吗?...
  3. 服务端挂了,客户端的TCP连接还会在吗?
  4. elasticsearch数据类型--join
  5. 如何彻底关闭:Windows Defender Service
  6. stable diffusion图片资源分享和模型推荐,好用的模型有哪些呢?
  7. NetApp、曙光十年修得同船渡,得软件定义存储者得天下
  8. openDS LDAP openLDAP
  9. 报告 | 《2022年数据隐私统计、事实与趋势》,涵盖26项数据隐私统计数据
  10. 使用Eclipse性能测试插件TPTP改进你的程序(一)