package com.code2roc.fastface.config;
|
|
import com.alibaba.druid.pool.DruidDataSource;
|
import com.alibaba.druid.support.http.StatViewServlet;
|
import com.baomidou.mybatisplus.core.MybatisConfiguration;
|
import com.code2roc.fastface.db.MasterJdbcTemplate;
|
import com.code2roc.fastface.db.PackagesSqlSessionFactoryBean;
|
import org.apache.ibatis.session.SqlSessionFactory;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.boot.web.servlet.ServletRegistrationBean;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Primary;
|
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
|
import org.sqlite.SQLiteConfig;
|
import org.sqlite.SQLiteOpenMode;
|
|
import javax.sql.DataSource;
|
import java.io.File;
|
import java.io.IOException;
|
import java.sql.SQLException;
|
|
@Configuration
|
public class DataSourceConfig {
|
@Value("${datasource.master.driverClassName}")
|
private String driverClassName;
|
@Value("${datasource.master.url}")
|
private String dbUrl;
|
@Value("${datasource.master.username}")
|
private String username;
|
@Value("${datasource.master.password}")
|
private String password;
|
|
@Bean
|
@Primary
|
@Qualifier("masterDataSource")
|
public DataSource masterDataSource() {
|
DruidDataSource datasource = new DruidDataSource();
|
if(driverClassName.equals("com.mysql.cj.jdbc.Driver")){
|
if(!dbUrl.contains("useOldAliasMetadataBehavior")){
|
dbUrl += "&useOldAliasMetadataBehavior=true";
|
}
|
if(!dbUrl.contains("useAffectedRows")){
|
dbUrl += "&useAffectedRows=true";
|
}
|
}
|
if(driverClassName.equals("org.sqlite.JDBC")){
|
initSqliteFile(dbUrl.replace("jdbc:sqlite:",""));
|
SQLiteConfig config= new SQLiteConfig();
|
config.setOpenMode(SQLiteOpenMode.OPEN_URI);
|
config.setOpenMode(SQLiteOpenMode.READWRITE);
|
config.setOpenMode(SQLiteOpenMode.SHAREDCACHE);
|
config.setOpenMode(SQLiteOpenMode.NOMUTEX);
|
datasource.addConnectionProperty(SQLiteConfig.Pragma.OPEN_MODE.pragmaName, String.valueOf(config.getOpenModeFlags()));
|
datasource.addConnectionProperty(SQLiteConfig.Pragma.JOURNAL_MODE.pragmaName, SQLiteConfig.JournalMode.WAL.toString() );
|
}
|
datasource.setUrl(this.dbUrl);
|
datasource.setUsername(username);
|
datasource.setPassword(password);
|
datasource.setDriverClassName(driverClassName);
|
//configuration
|
datasource.setInitialSize(1);
|
datasource.setMinIdle(3);
|
datasource.setMaxActive(20);
|
datasource.setMaxWait(60000);
|
datasource.setTimeBetweenEvictionRunsMillis(60000);
|
datasource.setMinEvictableIdleTimeMillis(60000);
|
datasource.setValidationQuery("select 'x'");
|
datasource.setTestWhileIdle(true);
|
datasource.setTestOnBorrow(false);
|
datasource.setTestOnReturn(false);
|
datasource.setMaxPoolPreparedStatementPerConnectionSize(20);
|
if(driverClassName.equals("org.sqlite.JDBC")){
|
datasource.setPoolPreparedStatements(false);
|
}else{
|
datasource.setPoolPreparedStatements(true);
|
}
|
datasource.setLogAbandoned(false); //移除泄露连接发生是是否记录日志
|
|
try {
|
if(!driverClassName.equals("org.sqlite.JDBC")){
|
datasource.setFilters("stat,slf4j");
|
}
|
} catch (SQLException e) {
|
e.printStackTrace();
|
}
|
datasource.setConnectionProperties("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000");//connectionProperties);
|
|
return datasource;
|
}
|
|
public static void initSqliteFile(String filePath){
|
File file = new File(filePath);
|
|
File dir = file.getParentFile();
|
if(!dir.exists()){
|
dir.mkdirs();
|
}
|
|
if(!file.exists()){
|
try {
|
file.createNewFile();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
@Primary
|
@Bean("masterTransactionManager")
|
public DataSourceTransactionManager MasterTransactionManager() {
|
return new DataSourceTransactionManager(masterDataSource());
|
}
|
|
@Bean
|
public ServletRegistrationBean druidServlet() {
|
ServletRegistrationBean reg = new ServletRegistrationBean();
|
reg.setServlet(new StatViewServlet());
|
reg.addUrlMappings("/druid/*");
|
reg.addInitParameter("allow", ""); //白名单
|
reg.addInitParameter("loginUsername", "admin123");
|
reg.addInitParameter("loginPassword", "abcd@1234");
|
return reg;
|
}
|
|
@Bean
|
public SqlSessionFactory sqlSessionFactory() throws Exception {
|
final PackagesSqlSessionFactoryBean sessionFactory = new PackagesSqlSessionFactoryBean();
|
sessionFactory.setDataSource(masterDataSource());
|
//关闭驼峰转换,防止带下划线的字段无法映射
|
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(false);
|
MybatisConfiguration mybatisConfiguration = sessionFactory.getConfiguration();
|
if(mybatisConfiguration==null){
|
mybatisConfiguration = new MybatisConfiguration();
|
}
|
sessionFactory.setConfiguration(mybatisConfiguration);
|
return sessionFactory.getObject();
|
}
|
|
@Bean
|
public MasterJdbcTemplate jdbcTemplate(){
|
MasterJdbcTemplate jdbcTemplate = null;
|
try{
|
jdbcTemplate = new MasterJdbcTemplate(masterDataSource());
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
return jdbcTemplate;
|
}
|
}
|