package com.dy.common.multiDataSource;
|
|
import org.apache.ibatis.transaction.Transaction;
|
import org.springframework.jdbc.CannotGetJdbcConnectionException;
|
import org.springframework.jdbc.datasource.DataSourceUtils;
|
|
import javax.sql.DataSource;
|
import java.sql.Connection;
|
import java.sql.SQLException;
|
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentMap;
|
|
/**
|
* 多数据源的事务类,事务对象由事务工厂创建,完成数据库事务操作。
|
* 事务对象包裹着:
|
* 数据库连接、事务提交、事务回滚等对象及操作
|
* 在事务对象中具体决定采用的具体数据源
|
*/
|
public class MultiDataSourceTransaction implements Transaction {
|
|
private final DataSource multidataSource;
|
|
private final ConcurrentMap<String, Connection> curConMap;
|
|
private boolean autoCommit;
|
|
|
public MultiDataSourceTransaction(DataSource dataSource, boolean autoCommit) {
|
//dataSource是DynamicDataSource类的实例
|
this.multidataSource = dataSource;
|
this.autoCommit = autoCommit;
|
curConMap = new ConcurrentHashMap<>();
|
}
|
|
|
@Override
|
public Connection getConnection() throws SQLException {
|
String nowDsName = DataSourceContext.get();
|
if (nowDsName == null || "".equals(nowDsName)) {//StringUtils.isEmpty(databaseIdentification)
|
//databaseIdentification = DataSourceName.USERDATASOURCE.getName();
|
throw new CannotGetJdbcConnectionException("未得到数据源名称");
|
//nowDsName = "ym" ;
|
}
|
//获取数据源连接
|
if (!this.curConMap.containsKey(nowDsName)) {
|
try {
|
Connection conn = this.multidataSource.getConnection();
|
this.autoCommit = false;
|
conn.setAutoCommit(false);
|
this.curConMap.put(nowDsName, conn);
|
} catch (SQLException ex) {
|
throw new CannotGetJdbcConnectionException("未得到数据源JDBC连接", ex);
|
}
|
}
|
return this.curConMap.get(nowDsName);
|
}
|
|
|
@Override
|
public void commit() throws SQLException {
|
for (Connection connection : curConMap.values()) {
|
if (!autoCommit) {
|
connection.commit();
|
}
|
}
|
}
|
|
@Override
|
public void rollback() throws SQLException {
|
for (Connection connection : curConMap.values()) {
|
connection.rollback();
|
}
|
}
|
|
@Override
|
public void close() throws SQLException {
|
for (Connection connection : curConMap.values()) {
|
DataSourceUtils.releaseConnection(connection, this.multidataSource);
|
}
|
}
|
|
@Override
|
public Integer getTimeout() throws SQLException {
|
return null;
|
}
|
}
|