DataSourceConfig.java 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package com.kmall.admin.config.datasource;
  2. import com.alibaba.druid.filter.Filter;
  3. import com.alibaba.druid.filter.stat.StatFilter;
  4. import com.alibaba.druid.pool.DruidDataSource;
  5. import com.alibaba.druid.wall.WallConfig;
  6. import com.alibaba.druid.wall.WallFilter;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.context.annotation.PropertySource;
  11. import org.springframework.core.env.Environment;
  12. import org.springframework.util.StringUtils;
  13. import java.util.ArrayList;
  14. import java.util.Collections;
  15. import java.util.List;
  16. /**
  17. * @author lhm
  18. * @createDate 2021-12-15
  19. */
  20. @Configuration
  21. @PropertySource(value = {"classpath:conf/db.properties"})
  22. public class DataSourceConfig {
  23. @Autowired
  24. private Environment environment;
  25. @Bean
  26. public DataSourceProperties dataSourceProperties() {
  27. DataSourceProperties dataSourceProperties = new DataSourceProperties();
  28. String env = environment.getProperty("jdbc.env");
  29. String url = environment.getProperty(String.format("jdbc.%s.url", env));
  30. String username = environment.getProperty(String.format("jdbc.%s.username", env));
  31. String password = environment.getProperty(String.format("jdbc.%s.password", env));
  32. String initialSize = environment.getProperty("jdbc.initialSize");
  33. String maxActive = environment.getProperty("jdbc.maxActive");
  34. String minPoolSize = environment.getProperty("jdbc.minPoolSize");
  35. String maxIdleTime = environment.getProperty("jdbc.maxIdleTime");
  36. String idleConnectionTestPeriod = environment.getProperty("jdbc.idleConnectionTestPeriod");
  37. String driver = environment.getProperty("jdbc.driver");
  38. String idleTimeout = environment.getProperty("jdbc.idleTimeout");
  39. String maxLifetime = environment.getProperty("jdbc.maxLifetime");
  40. String connectionTimeout = environment.getProperty("jdbc.connectionTimeout");
  41. String maximumPoolSize = environment.getProperty("jdbc.maximumPoolSize");
  42. String validationTimeout = environment.getProperty("jdbc.validationTimeout");
  43. dataSourceProperties.setEnv(env);
  44. dataSourceProperties.setUrl(url);
  45. dataSourceProperties.setUsername(username);
  46. dataSourceProperties.setPassword(password);
  47. // 通用配置
  48. dataSourceProperties.setInitialSize(StringUtils.isEmpty(initialSize) ? 5 : Integer.parseInt(initialSize));
  49. dataSourceProperties.setMaxActive(StringUtils.isEmpty(maxActive) ? 30 : Integer.parseInt(maxActive));
  50. dataSourceProperties.setMinPoolSize(StringUtils.isEmpty(minPoolSize) ? 2 : Integer.parseInt(minPoolSize));
  51. dataSourceProperties.setMaxIdleTime(StringUtils.isEmpty(maxIdleTime) ? 30000 : Integer.parseInt(maxIdleTime));
  52. dataSourceProperties.setIdleConnectionTestPeriod(StringUtils.isEmpty(idleConnectionTestPeriod) ? 100 : Integer.parseInt(idleConnectionTestPeriod));
  53. dataSourceProperties.setDriver(driver);
  54. dataSourceProperties.setIdleTimeout(StringUtils.isEmpty(idleTimeout) ? 400000L : Long.parseLong(idleTimeout));
  55. dataSourceProperties.setMaxLifetime(StringUtils.isEmpty(maxLifetime) ? 500000L : Long.parseLong(maxLifetime));
  56. dataSourceProperties.setConnectionTimeout(StringUtils.isEmpty(connectionTimeout) ? 5000L : Long.parseLong(connectionTimeout));
  57. dataSourceProperties.setMaximumPoolSize(StringUtils.isEmpty(maximumPoolSize) ? 5 : Integer.parseInt(maximumPoolSize));
  58. dataSourceProperties.setValidationTimeout(StringUtils.isEmpty(validationTimeout) ? 30L : Long.parseLong(validationTimeout));
  59. return dataSourceProperties;
  60. }
  61. @Bean(initMethod = "init", destroyMethod = "close")
  62. public DruidDataSource dataSource(DataSourceProperties dataSourceProperties,
  63. StatFilter statFilter,
  64. WallFilter wallFilter) {
  65. DruidDataSource druidDataSource = new DruidDataSource();
  66. druidDataSource.setUrl(dataSourceProperties.getUrl());
  67. druidDataSource.setUsername(dataSourceProperties.getUsername());
  68. druidDataSource.setPassword(dataSourceProperties.getPassword());
  69. druidDataSource.setInitialSize(dataSourceProperties.getInitialSize());
  70. druidDataSource.setMaxActive(dataSourceProperties.getMaxActive());
  71. List<Filter> filters = new ArrayList<>();
  72. filters.add(statFilter);
  73. filters.add(wallFilter);
  74. druidDataSource.setProxyFilters(filters);
  75. druidDataSource.setConnectionInitSqls(Collections.singleton("set names utf8mb4;"));
  76. // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  77. druidDataSource.setTimeBetweenEvictionRunsMillis(60000);
  78. // 配置一个连接在池中最小生存的时间,单位是毫秒
  79. druidDataSource.setMinEvictableIdleTimeMillis(300000);
  80. // 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效
  81. druidDataSource.setTestWhileIdle(true);
  82. // 指定每个连接上PSCache的大小
  83. druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
  84. return druidDataSource;
  85. }
  86. @Bean
  87. public StatFilter statFilter() {
  88. StatFilter statFilter = new StatFilter();
  89. statFilter.setSlowSqlMillis(1000);
  90. statFilter.setLogSlowSql(true);
  91. statFilter.setMergeSql(true);
  92. return statFilter;
  93. }
  94. @Bean
  95. public WallFilter wallFilter(WallConfig wallConfig) {
  96. WallFilter wallFilter = new WallFilter();
  97. wallFilter.setDbType("mysql");
  98. wallFilter.setConfig(wallConfig);
  99. return wallFilter;
  100. }
  101. /**
  102. * 过滤永真条件 防止注入
  103. */
  104. @Bean
  105. public WallConfig wallConfig() {
  106. WallConfig wallConfig = new WallConfig();
  107. wallConfig.setMultiStatementAllow(true);
  108. return wallConfig;
  109. }
  110. }