路泰机电科技体检——数据平台后端
zhaowenxuan
2025-08-04 f89a6c6acd475d84dd069df828d40ce27446e0fa
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package com.example.config.db;
 
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.example.config.ConfigValue;
import com.example.config.DruidProperties;
import com.example.enums.DataSourceType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
 
@Slf4j
@Configuration
public class DataSourceConfig {
 
    private static final String DEFAULT_DATA_SOURCE_KEY = "default"; // 主库的标识
    private final Map<String, DataSource> dataSourceCache = new HashMap<>(); // 数据源缓存
 
    @Autowired
    private ConfigValue configValue;
    private String primaryUrl;
    private String primaryPort;
    private String primaryUsername;
    private String primaryPassword;
    private String dbUrl;
    private String dbName;
    @Autowired
    private DruidProperties druidProperties;
 
    @Bean(name = "hospDynamicDataSources")
    public DataSource hospDynamicDataSources() {
        HospDynamicDataSource dynamicDataSource = new HospDynamicDataSource();
        Map<String, String> configMap = configValue.getConfigMap();
        dbUrl = configMap.get("ip");
        dbName = configMap.get("name");
        primaryPassword = configMap.get("password");
        primaryPort = configMap.get("prot");
        primaryUsername = configMap.get("username");
        String url = "jdbc:mysql://" + dbUrl + ":" + primaryPort + "/" + dbName;
        dynamicDataSource.addTargetDataSource(DEFAULT_DATA_SOURCE_KEY, createDataSource(url, primaryUsername, primaryPassword));
 
        DataSource masterDataSource = masterDataSource(druidProperties);
        dynamicDataSource.addTargetDataSource(DataSourceType.MASTER.name(),masterDataSource);
        dataSourceCache.put(DataSourceType.MASTER.name(), masterDataSource);
 
        dynamicDataSource.setDefaultTargetDataSource(dynamicDataSource.getTargetDataSources().get(DEFAULT_DATA_SOURCE_KEY)); // 设置默认数据源
        return dynamicDataSource;
    }
 
    // 动态创建数据源
    private DataSource createDataSource(String url, String username, String password) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
 
    // 根据用户 ID 动态获取数据源
    public void addDataSource(String dbName) {
        Map<String, String> configMap = configValue.getConfigMap();
        dbUrl = configMap.get("ip");
        primaryPassword = configMap.get("password");
        primaryPort = configMap.get("prot");
        primaryUsername = configMap.get("username");
        // 检查缓存中是否已经存在该数据源
        if (!dataSourceCache.containsKey(dbName)) {
            synchronized (this) {
                String url = "jdbc:mysql://" + dbUrl + ":" + primaryPort + "/" + dbName;
                DataSource dataSource = createDataSource(url, primaryUsername, primaryPassword);
                dataSourceCache.put(dbName, dataSource);
                HospDynamicDataSource dynamicDataSource = (HospDynamicDataSource) hospDynamicDataSources();
                dynamicDataSource.addTargetDataSource(dbName, dataSource);
            }
        }
    }
 
    public DataSource masterDataSource(DruidProperties druidProperties){
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        Map<String, String> configMap = configValue.getConfigMap();
        try {
            // 获取属性值并赋值
            Properties properties = new Properties();
            // 这里是测试写法,具体的value可以通过请求参数传递过来
            properties.setProperty("druid.url","jdbc:mysql://"+configMap.get("ip")+":"+configMap.get("prot")+"/"+configMap.get("name")+"" +
                    "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true");
            properties.setProperty("druid.username",configMap.get("username"));
            properties.setProperty("druid.password",configMap.get("password"));
            dataSource.restart(properties);
            log.info("数据库连接成功!!!");
        } catch (Exception e) {
            log.error("数据库连接失败  请联系管理员!",e);
        }
        return druidProperties.dataSource(dataSource);
    }
 
    private DruidDataSource creatSqlServer(String enabled, String ip,String port,String db,String user,String password) throws SQLException {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        Properties properties = new Properties();
        properties.setProperty("druid.enabled", enabled);
        properties.setProperty("druid.driverClassName","com.microsoft.sqlserver.jdbc.SQLServerDriver");
        properties.setProperty("druid.url","jdbc:sqlserver://"+ ip+":"+ port+";DatabaseName="+ db+
                ";&characterEncoding=utf8");
        properties.setProperty("druid.username", user);
        properties.setProperty("druid.password", password);
        dataSource.restart(properties);
        return dataSource;
    }
 
    private DruidDataSource creatMysql(String enabled, String ip,String port,String db,String user,String password) throws SQLException {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        Properties properties = new Properties();
        properties.setProperty("druid.enabled",enabled);
        properties.setProperty("druid.url","jdbc:mysql://"+ip+":"+port+"/"+db+"" +
                "?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8");
        properties.setProperty("druid.username",user);
        properties.setProperty("druid.password",password);
        dataSource.restart(properties);
        return dataSource;
    }
 
    private DruidDataSource creatOracle(String enabled, String ip,String port,String db,String user,String password) throws SQLException {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        Properties properties = new Properties();
        properties.setProperty("druid.enabled",enabled);
        properties.setProperty("druid.driverClassName","oracle.jdbc.OracleDriver");
        properties.setProperty("druid.url","jdbc:oracle:thin:@//"+ip+"/"+db);
        properties.setProperty("druid.username",user);
        properties.setProperty("druid.password",password);
        dataSource.restart(properties);
        return dataSource;
    }
 
}