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 curConMap; private boolean autoCommit; public MultiDataSourceTransaction(DataSource dataSource) { //dataSource是DynamicDataSource类的实例 this.multidataSource = dataSource; 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(); 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; } }