java110
2022-09-05 e7e71cbb7db449743c8a9ae834f04615abede3df
java110-db/src/main/java/com/java110/db/DataSourceConfig.java
old mode 100644 new mode 100755
@@ -1,24 +1,17 @@
package com.java110.db;
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.google.common.collect.Lists;
import io.shardingsphere.core.yaml.sharding.YamlShardingConfiguration;
import io.shardingsphere.core.yaml.sharding.YamlShardingRuleConfiguration;
import io.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
import com.java110.utils.util.StringUtil;
import org.apache.shardingsphere.shardingjdbc.api.yaml.YamlShardingDataSourceFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;
import javax.servlet.Filter;
import javax.sql.DataSource;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.io.*;
import java.sql.SQLException;
/**
@@ -27,9 +20,11 @@
@Configuration
public class DataSourceConfig {
    @Autowired
    //@Autowired
    private Filter statFilter;
    @Autowired
    private Environment env;
    private static final String SHARDING_YML_PATH = "dataSource.yml";
    /**
@@ -44,14 +39,30 @@
     */
    @Bean
    public DataSource dataSource() throws SQLException, IOException {
        YamlShardingConfiguration config = parse();
        YamlShardingRuleConfiguration rule = config.getShardingRule();
        for (String key : config.getDataSources().keySet()) {
            DruidDataSource d = (DruidDataSource) config.getDataSources().get(key);
            d.setProxyFilters(Lists.newArrayList(statFilter));
        String path = SHARDING_YML_PATH;
        String[] actives = env.getActiveProfiles();
        if (actives != null && actives.length > 0 && !"dev".equals(actives[0])) {
            path = "dataSource-" + actives[0] + ".yml";
        }
        return ShardingDataSourceFactory.createDataSource(config.getDataSources(),
                rule.getShardingRuleConfiguration(), config.getConfigMap(), config.getProps());
        String configString = new String(getYmlFile(path), "UTF-8");
        configString = configString.replaceAll("\\$\\{mysqlpwd\\}", env.getProperty("mysqlpwd"));
        String mysqlPort = StringUtil.isEmpty(env.getProperty("mysqlport")) ? "3306" : env.getProperty("mysqlport");
        configString = configString.replaceAll("\\$\\{mysqlport\\}", mysqlPort);
        String dbttname = StringUtil.isEmpty(env.getProperty("dbttname")) ? "TT" : env.getProperty("dbttname");
        String dbttuser = StringUtil.isEmpty(env.getProperty("dbttuser")) ? "TT" : env.getProperty("dbttuser");
        String dbhcname = StringUtil.isEmpty(env.getProperty("dbhcname")) ? "hc_community" : env.getProperty("dbhcname");
        String dbhcuser = StringUtil.isEmpty(env.getProperty("dbhcuser")) ? "hc_community" : env.getProperty("dbhcuser");
        configString = configString.replaceAll("\\$\\{dbttname\\}", dbttname)
                .replaceAll("\\$\\{dbttuser\\}", dbttuser)
                .replaceAll("\\$\\{dbhcname\\}", dbhcname)
                .replaceAll("\\$\\{dbhcuser\\}", dbhcuser);
        return YamlShardingDataSourceFactory.createDataSource(configString.getBytes("UTF-8"));
    }
    /**
@@ -62,12 +73,29 @@
     * @throws FileNotFoundException        文件未发现异常
     * @throws UnsupportedEncodingException 不支持编码异常
     */
    private YamlShardingConfiguration parse() throws IOException, FileNotFoundException, UnsupportedEncodingException {
        Resource certResource = new ClassPathResource(SHARDING_YML_PATH);
        try (
                InputStreamReader inputStreamReader = new InputStreamReader(certResource.getInputStream(), "UTF-8")
        ) {
            return new Yaml(new Constructor(YamlShardingConfiguration.class)).loadAs(inputStreamReader, YamlShardingConfiguration.class);
    private byte[] getYmlFile(String path) throws IOException {
        Reader reader = null;
        InputStream inputStream = null;
        ByteArrayOutputStream swapStream = null;
        try {
            Resource resource = new ClassPathResource(path);
            inputStream = resource.getInputStream();
            swapStream = new ByteArrayOutputStream();
            byte[] buff = new byte[100];
            int rc = 0;
            while ((rc = inputStream.read(buff, 0, 100)) > 0) {
                swapStream.write(buff, 0, rc);
            }
            byte[] in2b = swapStream.toByteArray();
            return in2b;
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (swapStream != null) {
                swapStream.close();
            }
        }
    }
}