package com.kmall.admin.config.datasource; import com.alibaba.druid.filter.Filter; import com.alibaba.druid.filter.stat.StatFilter; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.wall.WallConfig; import com.alibaba.druid.wall.WallFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author lhm * @createDate 2021-12-15 */ @Configuration @PropertySource(value = {"classpath:conf/db.properties"}) public class DataSourceConfig { @Autowired private Environment environment; @Bean public DataSourceProperties dataSourceProperties() { DataSourceProperties dataSourceProperties = new DataSourceProperties(); String env = environment.getProperty("jdbc.env"); String url = environment.getProperty(String.format("jdbc.%s.url", env)); String username = environment.getProperty(String.format("jdbc.%s.username", env)); String password = environment.getProperty(String.format("jdbc.%s.password", env)); String initialSize = environment.getProperty("jdbc.initialSize"); String maxActive = environment.getProperty("jdbc.maxActive"); String minPoolSize = environment.getProperty("jdbc.minPoolSize"); String maxIdleTime = environment.getProperty("jdbc.maxIdleTime"); String idleConnectionTestPeriod = environment.getProperty("jdbc.idleConnectionTestPeriod"); String driver = environment.getProperty("jdbc.driver"); String idleTimeout = environment.getProperty("jdbc.idleTimeout"); String maxLifetime = environment.getProperty("jdbc.maxLifetime"); String connectionTimeout = environment.getProperty("jdbc.connectionTimeout"); String maximumPoolSize = environment.getProperty("jdbc.maximumPoolSize"); String validationTimeout = environment.getProperty("jdbc.validationTimeout"); dataSourceProperties.setEnv(env); dataSourceProperties.setUrl(url); dataSourceProperties.setUsername(username); dataSourceProperties.setPassword(password); // 通用配置 dataSourceProperties.setInitialSize(StringUtils.isEmpty(initialSize) ? 5 : Integer.parseInt(initialSize)); dataSourceProperties.setMaxActive(StringUtils.isEmpty(maxActive) ? 30 : Integer.parseInt(maxActive)); dataSourceProperties.setMinPoolSize(StringUtils.isEmpty(minPoolSize) ? 2 : Integer.parseInt(minPoolSize)); dataSourceProperties.setMaxIdleTime(StringUtils.isEmpty(maxIdleTime) ? 30000 : Integer.parseInt(maxIdleTime)); dataSourceProperties.setIdleConnectionTestPeriod(StringUtils.isEmpty(idleConnectionTestPeriod) ? 100 : Integer.parseInt(idleConnectionTestPeriod)); dataSourceProperties.setDriver(driver); dataSourceProperties.setIdleTimeout(StringUtils.isEmpty(idleTimeout) ? 400000L : Long.parseLong(idleTimeout)); dataSourceProperties.setMaxLifetime(StringUtils.isEmpty(maxLifetime) ? 500000L : Long.parseLong(maxLifetime)); dataSourceProperties.setConnectionTimeout(StringUtils.isEmpty(connectionTimeout) ? 5000L : Long.parseLong(connectionTimeout)); dataSourceProperties.setMaximumPoolSize(StringUtils.isEmpty(maximumPoolSize) ? 5 : Integer.parseInt(maximumPoolSize)); dataSourceProperties.setValidationTimeout(StringUtils.isEmpty(validationTimeout) ? 30L : Long.parseLong(validationTimeout)); return dataSourceProperties; } @Bean(initMethod = "init", destroyMethod = "close") public DruidDataSource dataSource(DataSourceProperties dataSourceProperties, StatFilter statFilter, WallFilter wallFilter) { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl(dataSourceProperties.getUrl()); druidDataSource.setUsername(dataSourceProperties.getUsername()); druidDataSource.setPassword(dataSourceProperties.getPassword()); druidDataSource.setInitialSize(dataSourceProperties.getInitialSize()); druidDataSource.setMaxActive(dataSourceProperties.getMaxActive()); List filters = new ArrayList<>(); filters.add(statFilter); filters.add(wallFilter); druidDataSource.setProxyFilters(filters); druidDataSource.setConnectionInitSqls(Collections.singleton("set names utf8mb4;")); // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 druidDataSource.setTimeBetweenEvictionRunsMillis(60000); // 配置一个连接在池中最小生存的时间,单位是毫秒 druidDataSource.setMinEvictableIdleTimeMillis(300000); // 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效 druidDataSource.setTestWhileIdle(true); // 指定每个连接上PSCache的大小 druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(20); return druidDataSource; } @Bean public StatFilter statFilter() { StatFilter statFilter = new StatFilter(); statFilter.setSlowSqlMillis(1000); statFilter.setLogSlowSql(true); statFilter.setMergeSql(true); return statFilter; } @Bean public WallFilter wallFilter(WallConfig wallConfig) { WallFilter wallFilter = new WallFilter(); wallFilter.setDbType("mysql"); wallFilter.setConfig(wallConfig); return wallFilter; } /** * 过滤永真条件 防止注入 */ @Bean public WallConfig wallConfig() { WallConfig wallConfig = new WallConfig(); wallConfig.setMultiStatementAllow(true); return wallConfig; } }