披荆斩棘之springboot整合atomikos
1.导入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
2.数据源配置
server:
port: 8090
spring:
datasource:
first:
jdbcUrl: jdbc:mysql://localhost:3306/test
username: root
password: root
min-pool-size: 3
max-pool-size: 25
max-lifetime: 20000
borrow-connection-timeout: 30
login-timeout: 30
maintenance-interval: 60
max-idle-time: 60
second:
jdbcUrl: jdbc:mysql://localhost:3306/test1
username: root
password: root
min-pool-size: 3
max-pool-size: 25
max-lifetime: 20000
borrow-connection-timeout: 30
login-timeout: 30
maintenance-interval: 60
max-idle-time: 60
3.配置对应实体类
数据源1:
package com.kevin.datasource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@Data
@ConfigurationProperties(prefix = "spring.datasource.first")
public class DataSourceI {
private String jdbcUrl;
private String username;
private String password;
private int minPoolSize;
private int maxPoolSize;
private int maxLifetime;
private int borrowConnectionTimeout;
private int loginTimeout;
private int maintenanceInterval;
private int maxIdleTime;
private String testQuery;
}
数据源2:
package com.kevin.datasource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ConfigurationProperties(prefix = "spring.datasource.second")
public class DataSourceII {
private String jdbcUrl;
private String username;
private String password;
private int minPoolSize;
private int maxPoolSize;
private int maxLifetime;
private int borrowConnectionTimeout;
private int loginTimeout;
private int maintenanceInterval;
private int maxIdleTime;
private String testQuery;
}
4.配置数据源+atomikos
package com.kevin.config;
import com.kevin.datasource.DataSourceI;
import com.mysql.cj.jdbc.MysqlXADataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.boot.jta.atomikos.AtomikosXADataSourceWrapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.sql.SQLException;
@Configuration
@MapperScan(basePackages = "com.kevin.mapper.first",sqlSessionFactoryRef = "sqlSessionFactory1",sqlSessionTemplateRef = "sqlSessionTemplate1")
public class DataSourceConfigFirst {
@Bean("dataSource1")
public DataSource dataSource1(DataSourceI dataSource) throws Exception {
MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
mysqlXADataSource.setUrl(dataSource.getJdbcUrl());
mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXADataSource.setUser(dataSource.getUsername());
mysqlXADataSource.setPassword(dataSource.getPassword());
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);
atomikosDataSourceBean.setUniqueResourceName("dataSource1");
atomikosDataSourceBean.setMinPoolSize(dataSource.getMinPoolSize());
atomikosDataSourceBean.setMaxPoolSize(dataSource.getMaxPoolSize());
atomikosDataSourceBean.setMaxLifetime(dataSource.getMaxLifetime());
atomikosDataSourceBean.setBorrowConnectionTimeout(dataSource.getBorrowConnectionTimeout());
atomikosDataSourceBean.setLoginTimeout(dataSource.getLoginTimeout());
atomikosDataSourceBean.setMaintenanceInterval(dataSource.getMaintenanceInterval());
atomikosDataSourceBean.setMaxIdleTime(dataSource.getMaxIdleTime());
atomikosDataSourceBean.setTestQuery(dataSource.getTestQuery());
return atomikosDataSourceBean;
}
@Bean("sqlSessionFactory1")
public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean.getObject();
}
@Bean("sqlSessionTemplate1")
public SqlSessionTemplate sqlSessionTemplate1(@Qualifier("sqlSessionFactory1") SqlSessionFactory sqlSessionFactory){
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
}
package com.kevin.config;
import com.kevin.datasource.DataSourceII;
import com.mysql.cj.jdbc.MysqlXADataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.jta.atomikos.AtomikosDataSourceBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.kevin.mapper.second",sqlSessionFactoryRef = "sqlSessionFactory2",sqlSessionTemplateRef = "sqlSessionTemplate2")
public class DataSourceConfigSecond {
@Bean("dataSource2")
public DataSource dataSource2( DataSourceII dataSource) throws Exception {
MysqlXADataSource mysqlXADataSource = new MysqlXADataSource();
mysqlXADataSource.setUrl(dataSource.getJdbcUrl());
mysqlXADataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXADataSource.setUser(dataSource.getUsername());
mysqlXADataSource.setPassword(dataSource.getPassword());
AtomikosDataSourceBean atomikosDataSourceBean = new AtomikosDataSourceBean();
atomikosDataSourceBean.setXaDataSource(mysqlXADataSource);
atomikosDataSourceBean.setUniqueResourceName("dataSource2");
atomikosDataSourceBean.setMinPoolSize(dataSource.getMinPoolSize());
atomikosDataSourceBean.setMaxPoolSize(dataSource.getMaxPoolSize());
atomikosDataSourceBean.setMaxLifetime(dataSource.getMaxLifetime());
atomikosDataSourceBean.setBorrowConnectionTimeout(dataSource.getBorrowConnectionTimeout());
atomikosDataSourceBean.setLoginTimeout(dataSource.getLoginTimeout());
atomikosDataSourceBean.setMaintenanceInterval(dataSource.getMaintenanceInterval());
atomikosDataSourceBean.setMaxIdleTime(dataSource.getMaxIdleTime());
atomikosDataSourceBean.setTestQuery(dataSource.getTestQuery());
return atomikosDataSourceBean;
}
@Bean("sqlSessionFactory2")
public SqlSessionFactory sqlSessionFactory2(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean.getObject();
}
@Bean("sqlSessionTemplate2")
public SqlSessionTemplate sqlSessionTemplate2(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory){
SqlSessionTemplate sqlSessionTemplate = new SqlSessionTemplate(sqlSessionFactory);
return sqlSessionTemplate;
}
}
5.启动配置
package com.kevin;
import com.kevin.datasource.DataSourceI;
import com.kevin.datasource.DataSourceII;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
/**
* Hello world!
*
*/
//开启自动配置,springboot的核心配置
@EnableAutoConfiguration
//配置springboot扫描包的范围,通过指定扫包范围可以提高程序效率
@ComponentScan(basePackages = {"com.kevin.datasource","com.kevin.controller","com.kevin.exception","com.kevin.aop","com.kevin.service","com.kevin.entity","com.kevin.config"})
//开启异步
@EnableAsync
//开启数据源配置属性
@EnableConfigurationProperties({DataSourceI.class, DataSourceII.class})
//配置mybatis扫包范围
@MapperScan(value = {"com.kevin.mapper"})
public class App
{
public static void main( String[] args )
{
SpringApplication.run(App.class,args);
}
}
6.使用数据源+atomikos
package com.kevin.service.first;
import com.kevin.entity.User;
import com.kevin.mapper.first.UserMapper1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class UserService1 {
@Autowired
private UserMapper1 userMapper;
public List<User> findUsers(){
return userMapper.getUsers();
}
@Transactional
public int addUser(int i,String username,String password){
userMapper.addUser(username,password);
i = 1/i;
return 1;
}
}
package com.kevin.service.second;
import com.kevin.entity.User;
import com.kevin.mapper.second.UserMapper2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
public class UserService2 {
@Autowired
private UserMapper2 userMapper;
public List<User> findUsers(){
return userMapper.findUsers();
}
@Transactional
public int addUser(int i,String username,String password){
userMapper.addUser(username,password);
i=1/i;
return 1;
}
}