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) { 
 | 
        //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; 
 | 
    } 
 | 
} 
 |