| New file | 
|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|