springboot使用jta-atomikos搭建分布式事物、多数据源
程序员文章站
2022-05-23 15:02:01
...
不多说,上代码:
1:引入包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2:配置application.yml
spring:
datasource:
atomikos:
dbcms:
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/zbox_cms?useUnicode=true&characterEncoding=utf8
minPoolSize: 5
maxPoolSize: 25
maxLifetime : 20000
borrowConnectionTimeout : 30
loginTimeout : 30
maintenanceInterval : 60
maxIdleTime : 60
dbuser:
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/zbox_user?useUnicode=true&characterEncoding=utf8
minPoolSize: 5
maxPoolSize: 25
maxLifetime : 20000
borrowConnectionTimeout : 30
loginTimeout : 30
maintenanceInterval : 60
maxIdleTime : 60
3:配置数据源实体和config
package com.hao.dataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import lombok.Data;
@Data
@ConfigurationProperties(prefix = "spring.datasource.atomikos.dbcms")
public class ZboxDataCmsConfig {
private String url;
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;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getMinPoolSize() {
return minPoolSize;
}
public void setMinPoolSize(int minPoolSize) {
this.minPoolSize = minPoolSize;
}
public int getMaxPoolSize() {
return maxPoolSize;
}
public void setMaxPoolSize(int maxPoolSize) {
this.maxPoolSize = maxPoolSize;
}
public int getMaxLifetime() {
return maxLifetime;
}
public void setMaxLifetime(int maxLifetime) {
this.maxLifetime = maxLifetime;
}
public int getBorrowConnectionTimeout() {
return borrowConnectionTimeout;
}
public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {
this.borrowConnectionTimeout = borrowConnectionTimeout;
}
public int getLoginTimeout() {
return loginTimeout;
}
public void setLoginTimeout(int loginTimeout) {
this.loginTimeout = loginTimeout;
}
public int getMaintenanceInterval() {
return maintenanceInterval;
}
public void setMaintenanceInterval(int maintenanceInterval) {
this.maintenanceInterval = maintenanceInterval;
}
public int getMaxIdleTime() {
return maxIdleTime;
}
public void setMaxIdleTime(int maxIdleTime) {
this.maxIdleTime = maxIdleTime;
}
public String getTestQuery() {
return testQuery;
}
public void setTestQuery(String testQuery) {
this.testQuery = testQuery;
}
}
package com.hao.dataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import lombok.Data;
@Data
@ConfigurationProperties(prefix = "spring.datasource.atomikos.dbuser")
public class ZboxDataUserConfig {
private String url;
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;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getMinPoolSize() {
return minPoolSize;
}
public void setMinPoolSize(int minPoolSize) {
this.minPoolSize = minPoolSize;
}
public int getMaxPoolSize() {
return maxPoolSize;
}
public void setMaxPoolSize(int maxPoolSize) {
this.maxPoolSize = maxPoolSize;
}
public int getMaxLifetime() {
return maxLifetime;
}
public void setMaxLifetime(int maxLifetime) {
this.maxLifetime = maxLifetime;
}
public int getBorrowConnectionTimeout() {
return borrowConnectionTimeout;
}
public void setBorrowConnectionTimeout(int borrowConnectionTimeout) {
this.borrowConnectionTimeout = borrowConnectionTimeout;
}
public int getLoginTimeout() {
return loginTimeout;
}
public void setLoginTimeout(int loginTimeout) {
this.loginTimeout = loginTimeout;
}
public int getMaintenanceInterval() {
return maintenanceInterval;
}
public void setMaintenanceInterval(int maintenanceInterval) {
this.maintenanceInterval = maintenanceInterval;
}
public int getMaxIdleTime() {
return maxIdleTime;
}
public void setMaxIdleTime(int maxIdleTime) {
this.maxIdleTime = maxIdleTime;
}
public String getTestQuery() {
return testQuery;
}
public void setTestQuery(String testQuery) {
this.testQuery = testQuery;
}
}
package com.hao.dataSource;
import java.sql.SQLException;
import javax.sql.DataSource;
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.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
@Configuration
@MapperScan(basePackages = { "com.hao.cms.blog.mapper", "com.hao.cms.dict.mapper",
"com.hao.cms.dnf.mapper","com.hao.cms.music.mapper","com.hao.cms.upload.mapper" }, sqlSessionFactoryRef = "cmsSqlSessionFactory")
public class ZboxSourceCmsConfig {
@Primary
@Bean(name = "cmsDataSource")
public DataSource cmsDataSource(ZboxDataCmsConfig cmsConfig) throws SQLException {
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(cmsConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(cmsConfig.getPassword());
mysqlXaDataSource.setUser(cmsConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
// 创建Atomikos全局事务,所有的事务注册进来
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("cmsDataSource"); // testDataSource这个数据源的注册
xaDataSource.setMinPoolSize(cmsConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(cmsConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(cmsConfig.getMaxLifetime());
xaDataSource.setBorrowConnectionTimeout(cmsConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(cmsConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(cmsConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(cmsConfig.getMaxIdleTime());
xaDataSource.setTestQuery(cmsConfig.getTestQuery());
return xaDataSource;
}
@Primary
@Bean(name = "cmsSqlSessionFactory")
public SqlSessionFactory cmsSqlSessionFactory(@Qualifier("cmsDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Primary
@Bean(name = "cmsSqlSessionTemplate")
public SqlSessionTemplate cmsSqlSessionTemplate(
@Qualifier("cmsSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
package com.hao.dataSource;
import java.sql.SQLException;
import javax.sql.DataSource;
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.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.atomikos.jdbc.AtomikosDataSourceBean;
import com.mysql.jdbc.jdbc2.optional.MysqlXADataSource;
@Configuration
@MapperScan(basePackages = {"com.hao.cms.sso.mapper"}, sqlSessionFactoryRef = "userSqlSessionFactory")
public class ZboxSourceUserConfig {
@Bean(name = "userDataSource")
public DataSource userDataSource(ZboxDataUserConfig userConfig) throws SQLException {
MysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
mysqlXaDataSource.setUrl(userConfig.getUrl());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
mysqlXaDataSource.setPassword(userConfig.getPassword());
mysqlXaDataSource.setUser(userConfig.getUsername());
mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
//创建Atomikos全局事务,所有的事务注册进来
AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
xaDataSource.setXaDataSource(mysqlXaDataSource);
xaDataSource.setUniqueResourceName("userDataSource"); //testDataSource这个数据源的注册
xaDataSource.setMinPoolSize(userConfig.getMinPoolSize());
xaDataSource.setMaxPoolSize(userConfig.getMaxPoolSize());
xaDataSource.setMaxLifetime(userConfig.getMaxLifetime());
xaDataSource.setBorrowConnectionTimeout(userConfig.getBorrowConnectionTimeout());
xaDataSource.setLoginTimeout(userConfig.getLoginTimeout());
xaDataSource.setMaintenanceInterval(userConfig.getMaintenanceInterval());
xaDataSource.setMaxIdleTime(userConfig.getMaxIdleTime());
xaDataSource.setTestQuery(userConfig.getTestQuery());
return xaDataSource;
}
@Bean(name = "userSqlSessionFactory")
public SqlSessionFactory userSqlSessionFactory(@Qualifier("userDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
@Bean(name = "userSqlSessionTemplate")
public SqlSessionTemplate userSqlSessionTemplate(
@Qualifier("userSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
app
package com.hao;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import com.hao.dataSource.ZboxDataAxbConfig;
import com.hao.dataSource.ZboxDataCmsConfig;
import com.hao.dataSource.ZboxDataUserConfig;
import com.hao.dataSource.ZboxDataZboxConfig;
/**
* 项目启动类
*/
@SpringBootApplication
@ServletComponentScan
@MapperScan({"com.hao.**.service","com.hao.**.mapper","com.hao.**.dao"})
@EnableConfigurationProperties(value = { ZboxDataAxbConfig.class, ZboxDataCmsConfig.class, ZboxDataUserConfig.class, ZboxDataZboxConfig.class })
public class App extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Override//为了打包springboot项目
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
return builder.sources(this.getClass());
}
}
说明:
sourceconfig类需要扫描到准确的mapper,在分包的时候一定记得包内尽量不要出现多个数据源的mapper
出现问题,多看看自己扫描的包是否有问题。
启动失败,有可能是扫描出问题,看看启动的日志。
上一篇: Spring配置bean之实例工厂方法