package com.java110.db;
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 javax.servlet.Filter;
import javax.sql.DataSource;
import java.io.*;
import java.sql.SQLException;
/**
* 数据源配置
*/
@Configuration
public class SharejdbcDataSourceConfig {
//@Autowired
private Filter statFilter;
@Autowired
private Environment env;
private static final String SHARDING_YML_PATH = "dataSource.yml";
/**
* 构建dataSource
* 这里没有使用ShardingDataSourceFactory
* 因为要为durid数据源配置监听Filter
*
* @return 数据源对象
* @throws SQLException sql异常
* @throws IOException IO 异常
* @since 1.8
*/
@Bean
public DataSource dataSource() throws SQLException, IOException {
String path = SHARDING_YML_PATH;
String[] actives = env.getActiveProfiles();
if (actives != null && actives.length > 0 && !"dev".equals(actives[0])) {
path = "dataSource-" + actives[0] + ".yml";
}
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"));
}
/**
* 解析yml
*
* @return yaml 配置文件
* @throws IOException IO 异常
* @throws FileNotFoundException 文件未发现异常
* @throws UnsupportedEncodingException 不支持编码异常
*/
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();
}
}
}
}