liurunyu
2023-11-04 df37487916ebc1ff8d8e0f8b088c5b6af1e582ff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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;
    }
}