diff --git a/src/main/java/com/ydw/bat/wkflow/config/DruidDataSourceConfig.java b/src/main/java/com/ydw/bat/wkflow/config/DruidDataSourceConfig.java new file mode 100644 index 00000000..e17f2fdf --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/config/DruidDataSourceConfig.java @@ -0,0 +1,163 @@ +package com.ydw.bat.wkflow.config; + +import com.alibaba.druid.filter.Filter; +import com.alibaba.druid.filter.logging.Slf4jLogFilter; +import com.alibaba.druid.filter.stat.StatFilter; +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; +import com.alibaba.druid.wall.WallConfig; +import com.alibaba.druid.wall.WallFilter; +import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator; +import org.springframework.boot.context.properties.bind.BindResult; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.boot.context.properties.source.ConfigurationPropertySources; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.*; + +@Configuration +@EnableTransactionManagement +public class DruidDataSourceConfig implements EnvironmentAware { + private Properties propertyResolver; + + private Properties configResolver; + + public DruidDataSourceConfig() { + } + + public void setEnvironment(Environment env) { + Iterable sources = ConfigurationPropertySources.get(env); + Binder binder = new Binder(sources); + BindResult propertyResolverBind = binder.bind("spring.datasource", Properties.class); + BindResult configResolverBind = binder.bind("spring.profiles", Properties.class); + + propertyResolver= propertyResolverBind.get(); + configResolver = configResolverBind.get(); + } + + + @Bean( + name = {"dataSource"} + ) + public DataSource dataSource() throws SQLException { + DruidDataSource datasource = new DruidDataSource(); + datasource.setUrl(this.propertyResolver.getProperty("url")); + datasource.setDriverClassName(this.propertyResolver.getProperty("driver-class-name")); + datasource.setUsername(this.propertyResolver.getProperty("username")); + datasource.setPassword(this.propertyResolver.getProperty("password")); + datasource.setInitialSize(Integer.valueOf(this.propertyResolver.getProperty("initialSize"))); + datasource.setMinIdle(Integer.valueOf(this.propertyResolver.getProperty("minIdle"))); + datasource.setMaxWait(Long.valueOf(this.propertyResolver.getProperty("maxWait"))); + datasource.setMaxActive(Integer.valueOf(this.propertyResolver.getProperty("maxActive"))); + datasource.setTimeBetweenEvictionRunsMillis(Long.valueOf(this.propertyResolver.getProperty("timeBetweenEvictionRunsMillis"))); + datasource.setMinEvictableIdleTimeMillis(Long.valueOf(this.propertyResolver.getProperty("minEvictableIdleTimeMillis"))); +// datasource.setRemoveAbandoned(Boolean.valueOf(this.propertyResolver.getProperty("removeAbandoned"))); +// datasource.setRemoveAbandonedTimeout(Integer.valueOf(this.propertyResolver.getProperty("removeAbandonedTimeout"))); + datasource.setTestOnBorrow(Boolean.valueOf(this.propertyResolver.getProperty("testOnBorrow"))); + datasource.setTestOnReturn(Boolean.valueOf(this.propertyResolver.getProperty("testOnReturn"))); + datasource.setTestWhileIdle(Boolean.valueOf(this.propertyResolver.getProperty("testWhileIdle"))); + datasource.setValidationQuery(this.propertyResolver.getProperty("validationQuery")); +// datasource.setValidationQueryTimeout(Integer.valueOf(this.propertyResolver.getProperty("validationQueryTimeout"))); +// datasource.setKeepAlive(Boolean.valueOf(this.propertyResolver.getProperty("keepAlive"))); + // if("prd".equals(this.configResolver.getProperty("active"))){ + // datasource.setConnectProperties(this.connectionProper()); + // } + // datasource.setConnectProperties(this.connectionProper()); + List filters = new ArrayList(); + filters.add(this.wallFilter()); + filters.add(this.statFilter()); + filters.add(this.slf4jLogFilter()); + // if("prd".equals(this.configResolver.getProperty("active"))){ + // filters.add(new ConfigFilter()); + // } + // filters.add(new ConfigFilter()); + datasource.setProxyFilters(filters); + // 启动时自动初始化维护连接 + datasource.init(); + return datasource; + } + + @Bean + public StatFilter statFilter() { + StatFilter statFilter = new StatFilter(); + statFilter.setMergeSql(Boolean.valueOf(this.propertyResolver.getProperty("mergeSql"))); + statFilter.setSlowSqlMillis(Long.valueOf(this.propertyResolver.getProperty("slowSqlMillis"))); + statFilter.setLogSlowSql(Boolean.valueOf(this.propertyResolver.getProperty("logSlowSql"))); + return statFilter; + } + + @Bean + public WallFilter wallFilter() { + WallFilter wallFilter = new WallFilter(); + wallFilter.setLogViolation(true); + wallFilter.setThrowException(false); + wallFilter.setConfig(this.wallConfig()); + return wallFilter; + } + + @Bean + public Slf4jLogFilter slf4jLogFilter() { + Slf4jLogFilter slf4jLogFilter = new Slf4jLogFilter(); + return slf4jLogFilter; + } + + public Properties connectionProper(){ + Properties connection=new Properties(); + connection.setProperty("config.decrypt","true"); + connection.setProperty("config.decrypt.key",this.propertyResolver.getProperty("publicKey")); + return connection; + } + + @Bean + public ServletRegistrationBean druidServlet() { + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); + servletRegistrationBean.setServlet(new StatViewServlet()); + servletRegistrationBean.addUrlMappings(new String[]{"/druid/*"}); + Map initParameters = new HashMap(); + initParameters.put("resetEnable", "true"); + initParameters.put("loginUsername", "druid"); + initParameters.put("loginPassword", "druid"); + servletRegistrationBean.setInitParameters(initParameters); + return servletRegistrationBean; + } + + @Bean + public FilterRegistrationBean filterRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new WebStatFilter()); + filterRegistrationBean.addUrlPatterns(new String[]{"/*"}); + filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } + + @Bean({"druid-stat-interceptor"}) + public DruidStatInterceptor DruidStatInterceptor() { + DruidStatInterceptor druidStatInterceptor = new DruidStatInterceptor(); + return druidStatInterceptor; + } + + @Bean + public BeanNameAutoProxyCreator beanNameAutoProxyCreator() { + BeanNameAutoProxyCreator beanNameAutoProxyCreator = new BeanNameAutoProxyCreator(); + beanNameAutoProxyCreator.setProxyTargetClass(true); + beanNameAutoProxyCreator.setInterceptorNames(new String[]{"druid-stat-interceptor"}); + return beanNameAutoProxyCreator; + } + + @Bean + public WallConfig wallConfig() { + WallConfig wallConfig = new WallConfig(); + wallConfig.setMultiStatementAllow(true); + return wallConfig; + } +} \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 48b57516..17c53eb3 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -33,6 +33,33 @@ spring: url: jdbc:mysql://test.eqbidding.com:3306/bat-wkflow?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8 username: fxd password: 123456 + initialSize: 5 + minIdle: 5 + maxActive: 20 + maxWait: 60000 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + slowSqlMillis: 5000 + logSlowSql: true + # 打开PSCache + poolPreparedStatements: true + #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入 + #如果运行时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority + #则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j + filters: stat,wall + #指定每个连接上PSCache的大小 + maxPoolPreparedStatementPerConnectionSize: 20 + #合并多个DruidDataSource的监控数据 + useGlobalDataSourceStat: true + stat-view-servlet: + enabled: true + login-username: druid + login-password: druid + url-pattern: /druid/* activiti: database-schema-update: true # 自动部署验证设置:true-开启(默认)、false-关闭 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 7854f46a..15ea9869 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -39,6 +39,33 @@ spring: url: jdbc:mysql://121.36.69.172:3307/foton-bat-wkflow-test?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8 username: root password: hzwlsoft.com + initialSize: 5 + minIdle: 5 + maxActive: 20 + maxWait: 60000 + timeBetweenEvictionRunsMillis: 60000 + minEvictableIdleTimeMillis: 300000 + validationQuery: SELECT 1 FROM DUAL + testWhileIdle: true + testOnBorrow: false + testOnReturn: false + slowSqlMillis: 5000 + logSlowSql: true + # 打开PSCache + poolPreparedStatements: true + #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入 + #如果运行时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority + #则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j + filters: stat,wall + #指定每个连接上PSCache的大小 + maxPoolPreparedStatementPerConnectionSize: 20 + #合并多个DruidDataSource的监控数据 + useGlobalDataSourceStat: true + stat-view-servlet: + enabled: true + login-username: druid + login-password: druid + url-pattern: /druid/* activiti: database-schema-update: true # 自动部署验证设置:true-开启(默认)、false-关闭