123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- 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<Filter> 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;
- }
- }
|