环境:JDK1.8、MAVEN 3.6.1、eclipse
什么是Atomikos?
个人理解:atomikos是一个可以在一个事务中调用多个数据库并实现不同的数据库之间的操作,对数据库的操作进行统一的事务处理,如果出现异常可以统一回滚,是一个高效的分布式事务处理工具!
1.添加Atomikos依赖
当前的`pom文件:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.22.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<!-- 添加mysql的驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- junit配置 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
2.编写Atomikos配置类
当前的
AtomikosConfig
类内容如下:
/**
* @description 创建数据源,通过setUniqueResourceName设置当前数据源的唯一名称
* 可以配置多个数据源
*/
@Bean
public AtomikosDataSourceBean getAtomikosDataSourceBean() {
AtomikosDataSourceBean ds = new AtomikosDataSourceBean();
ds.setUniqueResourceName("mysql");// 设置当前数据源的唯一名称
// 设置XADataSource,当前填写的类必须是实现了XADataSource接口的类
ds.setXaDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
// 设置配置
Properties p = new Properties();
p.setProperty("user", "root");
p.setProperty("password", "root");
p.setProperty("url", "jdbc:mysql://localhost:3306/test");
ds.setXaProperties(p);
ds.setPoolSize(5);
return ds;
}
/**
* @description 创建事务管理
*/
@Bean
public UserTransactionManager getTransactionManager() {
UserTransactionManager userTxManager = new UserTransactionManager();
return userTxManager;
}
3.编写入口类
当前的
Application
类的内容:
/**
* @description 使用SpringBoot操作atomikos
* @author hy
* @date 2019-08-14
*/
@RestController
@SpringBootApplication
public class Application {
@Autowired
AtomikosDataSourceBean mysqlDataSourceBean;
@Autowired
UserTransactionManager txManager;
/**
* @description 测试连接是否正常
* @return
* @throws SQLException
*/
@RequestMapping("/testConnection")
public String testConnection() throws SQLException {
Connection connection = mysqlDataSourceBean.getConnection();
System.out.println("connection:" + connection);
System.out.println("开启连接。。。。。");
connection.close();
System.out.println("关闭数据连接。。。。");
return "【測試成功!】";// UserTransactionManager
}
/**
* @description 测试事务管理
* @return
* @throws Exception 异常,开启事务的错误和其他错误,。。。
*/
@RequestMapping("/testTxManager")
public String testTxManager() throws Exception{
txManager.begin();//开启事务管理
//开启连接。。。。
Connection mysqlConn = mysqlDataSourceBean.getConnection();
//执行数据库操作
System.out.println("执行数据库的操作成功!");
//关闭数据库操作
mysqlConn.close();
txManager.commit();//提交事务
//可以将一次事务执行多次操作,实现多个个不同的数据库之间的操作
return "【测试事务成功!】";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4.测试
4.1 访问testConnection
方法的结果:
connection:com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@67d24acf
开启连接。。。。。
2019-08-14 15:55:32.492 WARN 12588 — [nio-9090-exec-1] >c.atomikos.jdbc.AtomikosConnectionProxy : atomikos connection >proxyforcom.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@67d24acf: WARNING: >transaction manager not running?
2019-08-14 15:55:32.493 INFO 12588 — [nio-9090-exec-1] >c.atomikos.jdbc.AtomikosConnectionProxy : atomikos connection >proxyforcom.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@67d24acf: close()…
关闭数据连接。。。。
发现没有开启的事务的时候会出现警告!
4.2 访问testTxManager
方法的结果:
2019-08-14 16:22:32.604 INFO 9668 — [nio-9090-exec-1] >c.a.icatch.imp.BaseTransactionManager : createCompositeTransaction ( 10000 ): created new >ROOT transaction with id 192.168.133.1.tm0000100001
2019-08-14 16:22:32.606 INFO 9668 — [nio-9090-exec-1] >c.atomikos.jdbc.AbstractDataSourceBean : AtomikosDataSoureBean ‘mysql’: getConnection ( >null )…
2019-08-14 16:22:32.607 INFO 9668 — [nio-9090-exec-1] >c.atomikos.jdbc.AbstractDataSourceBean : AtomikosDataSoureBean ‘mysql’: init…
执行数据库的操作成功!
2019-08-14 16:22:32.607 INFO 9668 — [nio-9090-exec-1] >c.atomikos.jdbc.AtomikosConnectionProxy : atomikos connection proxy for >com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper@4cd96da2: close()…
2019-08-14 16:22:32.609 INFO 9668 — [nio-9090-exec-1] >c.a.icatch.imp.CompositeTransactionImp : commit() done (by application) of transaction >192.168.133.1.tm0000100001
发现之开启了一个事务进行管理!
总结
1.使用Atomikos进行统一的事务管理
的时候可以使用UserTransactionManager
这个类
2.使用Atomikos的时候,如果需要创建数据源必须使用实现了XADataSource
的数据源
3.使用Atomikos的事务的时候需要先开启事务,然后创建连接,最后关闭连接,在最后执行事务的关闭
4.当前案例只实现了简单的操作,但是可以看出Atomikos对事务的优化,和操作与原来的事务管理不同,后续可能会更新!
以上纯属个人见解,如有问题请联系本人!