一、springboot整合JTA
以两个数据库来作为例子讲解。
- 引入maven配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jta-atomikos</artifactId> </dependency>
-
新建jta接管driud配置文件
@Configuration public class DataSourceConfig { /** 引入配置文件数据库配置信息 **/ @Value("${spring.datasource.primary.url}") private String primaryUrl; @Value("${spring.datasource.primary.username}") private String primaryUsername; @Value("${spring.datasource.primary.password}") private String primaryPassword; @Value("${spring.datasource.primary.type}") private String primaryType; @Value("${spring.datasource.primary.driver-class-name}") private String driverClassName; //数据源1 @Bean(initMethod = "init") @Primary @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() throws SQLException { AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean(); atomikosDataSourceBean.setUniqueResourceName("primaryDataSource"); atomikosDataSourceBean.setXaDataSource(xaDataSource1()); atomikosDataSourceBean.setMaxPoolSize(20); atomikosDataSourceBean.setMinPoolSize(3); atomikosDataSourceBean.setMaxLifetime(600000); atomikosDataSourceBean.setMaxIdleTime(600000); atomikosDataSourceBean.setBorrowConnectionTimeout(300000); atomikosDataSourceBean.setLoginTimeout(300000); atomikosDataSourceBean.setMaintenanceInterval(280000); return atomikosDataSourceBean; } public XADataSource xaDataSource1() throws SQLException { DruidXADataSource xaDataSource = new DruidXADataSource(); xaDataSource.setUrl(primaryUrl); xaDataSource.setUsername(primaryUsername); xaDataSource.setPassword(primaryPassword); xaDataSource.setDriverClassName("com.mysql.jdbc.Driver"); xaDataSource.setTestOnBorrow(true); xaDataSource.setTestWhileIdle(true); xaDataSource.setTestOnReturn(false); xaDataSource.setInitialSize(5); xaDataSource.setMinIdle(5); xaDataSource.setMaxActive(20); xaDataSource.setMaxWait(600000); xaDataSource.setTimeBetweenEvictionRunsMillis(600000); xaDataSource.setMinEvictableIdleTimeMillis(3000000); xaDataSource.setValidationQuery("SELECT 1 FROM DUAL"); xaDataSource.setPoolPreparedStatements(true); xaDataSource.setMaxPoolPreparedStatementPerConnectionSize(20); xaDataSource.setFilters("stat,wall,log4j"); xaDataSource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500"); xaDataSource.setUseGlobalDataSourceStat(true); xaDataSource.setRemoveAbandonedTimeout(1800);//30分钟 return xaDataSource; } @Bean(name = "primaryJdbcTemplate") @Primary public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource) { return new JdbcTemplate(dataSource); } //数据源2的配置信息和数据源1相同,这里不再写入。 ---------------------------------------------------- /** * 注入事物管理器 * @return */ @Bean(name = "jtm") public JtaTransactionManager regTransactionManager () { UserTransactionManager userTransactionManager = new UserTransactionManager(); UserTransaction userTransaction = new UserTransactionImp(); return new JtaTransactionManager(userTransaction, userTransactionManager); } }
-
业务中引入JTA事务
//引入spring事务注解,事务名字要和配置文件的事务管理器名字一样,这样就纳入JTA管理,JTA会生成一个序列号 @Transactional(transactionManager = "jtm", rollbackFor = MyException.class) public RestResponse doCreateFacheTbl(Map<String, Object> params) throws MyException { List<TtVehicle> ttvehiclelist = this.iTtVehicleService.findTtVehicleByVin(StringUtil.toString(params.get("vin")), brandId);//从数据源1取值 Map<String, Object> ttvehicleMap = new HashMap<String, Object>(); ttvehicleMap.put("vin", params.get("vin")); ttvehicleMap.put("brand_id", brandId);// 品牌 ttvehicleMap.put("engine_no", ifaproductMap.get("engno"));// 发动机号 ttvehicleMap.put("vehicel_flag", "K");// 车辆状态 this.iTtVehicleService.doCreateTtVehicle(ttvehicleMap, user); //新增数据源1数据 this.iTiVehicleInoutService.doCreateTiVehicleInout(ttvehicleMap, user);//新增数据源2日志表 }
总结:
通过以上可以看出springboot引入JTA只需接管相应的数据源信息,然后配置对应的事务管理器,直接在业务代码中引入即可。