ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # spring的配置 ~~~ # 数据库访问配置 # 主数据源,默认的 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 # 下面为连接池的补充设置,应用到上面所有数据源中 # 初始化大小,最小,最大 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=20 # 配置获取连接等待超时的时间 spring.datasource.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 spring.datasource.minEvictableIdleTimeMillis=300000 spring.datasource.validationQuery=SELECT 1 FROM DUAL spring.datasource.testWhileIdle=true spring.datasource.testOnBorrow=false spring.datasource.testOnReturn=false # 打开PSCache,并且指定每个连接上PSCache的大小 spring.datasource.poolPreparedStatements=true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.datasource.filters=stat,wall,log4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 # 合并多个DruidDataSource的监控数据 #spring.datasource.useGlobalDataSourceStat=true ~~~ # driuid配置 ~~~ ## https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8 # 数据库配置 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.url=jdbc:mysql://localhost:3306/app?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT spring.datasource.druid.username=root spring.datasource.druid.password=root #########################连接池配置 # 初始化大小,最小,最大 spring.datasource.druid.initial-size=10 spring.datasource.druid.min-idle=10 spring.datasource.druid.max-active=100 # 配置获取连接等待超时的时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。 spring.datasource.druid.max-wait=6000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.druid.time-between-eviction-runs-millis=30000 spring.datasource.druid.validation-query=SELECT 1 FROM DUAL #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能,默认值为true spring.datasource.druid.test-on-borrow=false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能默认值为false spring.datasource.druid.test-on-return=false #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。默认值为false spring.datasource.druid.test-while-idle=true # 打开PSCache,并且指定每个连接上PSCache的大小 spring.datasource.druid.pool-prepared-statements=true #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。默认值为false spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20 # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.datasource.druid.filters=stat,wall,slf4j,default # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=3000 #spring.datasource.druid.filter.stat.enable=true #spring.datasource.druid.filter.stat.log-slow-sql=true #spring.datasource.druid.filter.stat.merge-sql=true #spring.datasource.druid.filter.stat.slow-sql-millis=3000 spring.datasource.druid.filter.slf4j.enabled=true spring.datasource.druid.filter.slf4j.statement-create-after-log-enabled=false spring.datasource.druid.filter.slf4j.statement-log-enabled=false spring.datasource.druid.filter.slf4j.statement-executable-sql-log-enable=true spring.datasource.druid.filter.slf4j.statement-log-error-enabled=true spring.datasource.druid.filter.slf4j.result-set-log-enabled=true #物理连接初始化的时候执行的sql #spring.datasource.druid.connection-init-sqls= # 合并多个DruidDataSource的监控数据 #spring.datasource.druid.use-global-data-source-stat=true ~~~ # DataSource配置 ~~~ import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class DruidConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource getDataSource() { return new DruidDataSource(); } } ~~~ # druid过滤器 ~~~ import com.alibaba.druid.support.http.WebStatFilter; import javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; /** * druid过滤器. */ @WebFilter(filterName="druidWebStatFilter", urlPatterns="/*", initParams={ @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")//忽略资源 } ) public class DruidStatFilter extends WebStatFilter { } ~~~ # druid数据源状态监控 ~~~ import com.alibaba.druid.support.http.StatViewServlet; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; /** * druid数据源状态监控. */ @WebServlet(urlPatterns="/druid/*", initParams={ @WebInitParam(name="allow",value=""),// IP白名单(没有配置或者为空,则允许所有访问) @WebInitParam(name="deny",value=""),// IP黑名单 (存在共同时,deny优先于allow) @WebInitParam(name="loginUsername",value="root"),// 用户名 @WebInitParam(name="loginPassword",value="root"),// 密码 @WebInitParam(name="resetEnable",value="true")// 禁用HTML页面上的“Reset All”功能 } ) public class DruidStatViewServlet extends StatViewServlet { private static final long serialVersionUID = 1L; } ~~~ # 启动时配置 这边要有`@ServletComponentScan` ~~~ @SpringBootApplication @ServletComponentScan public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ~~~ # 密码加密 配置实现 Druid对密码的加密解密是自动实现的。 1. 对用户名密码加密 ~~~ java -cp D:/druid-1.0.27.jar com.alibaba.druid.filter.config.ConfigTools root java -cp D:/druid-1.0.27.jar com.alibaba.druid.filter.config.ConfigTools 123456 ~~~ 执行完成以后会分别生成加密的用户密码以及对应的公钥和私钥。 ![](https://img.kancloud.cn/b9/5e/b95e0b5dc23dd157312741a56ec787fb_1286x406.png) **重写DruidDataSource** ~~~ import com.alibaba.druid.filter.config.ConfigTools; import com.alibaba.druid.pool.DruidDataSource; /** * 数据库用户名加密 */ public class DruidConnectionProvider extends DruidDataSource { private static final long serialVersionUID = 1377390212442554779L; private static String publicKey = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKfkK2hgtAKuV3uuU1wjo0kyuCFcf4QXxF4+zFUYWf4a5s6CJneKGzwE+onpUL3tsa3SB1Q1HtIlykXO+g7hlkECAwEAAQ=="; @Override public void setUsername(String username) { try { username = ConfigTools.decrypt(publicKey,username); } catch (Exception e) { e.printStackTrace(); } super.setUsername(username); } } ~~~ **配置dataSource** ~~~ <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${publickey}" /> ~~~ **配置persistence-mysql.properties文件** ~~~ mysql.driverclass=com.mysql.jdbc.Driver mysql.jdbcurl=jdbc:mysql://192.168.1.191:3306/itstyle?characterEncoding=UTF-8 mysql.user=iMNLTD842UfibiwKGgU4wWo8Gmf0wjb8HFkXmt1+S0XZ/3MdKhZx+TiApcXCCsIJGdrSr1a3vy6ugfLuHISZoQ== mysql.password=ZuLa1c/7gIzx8ZBzJy9PqfOlXFBdpebcNxMTblktk907JO9HDU/cMxq3tM7kKDsh+UBBYeALM/J+/38kSFU/9w== publickey = MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIOP8F1IDaIAqfzWMEccNxodnSXT0Z0ya3KCXKYxgvLz0WrEq1z7ilTfrOjfC6/HvPUIWjP6RZVIy5G2Rzn9W+cCAwEAAQ== ~~~ # 连接泄露 对性能影响比较大 [https://github.com/alibaba/druid/wiki/%E8%BF%9E%E6%8E%A5%E6%B3%84%E6%BC%8F%E7%9B%91%E6%B5%8B](https://github.com/alibaba/druid/wiki/%E8%BF%9E%E6%8E%A5%E6%B3%84%E6%BC%8F%E7%9B%91%E6%B5%8B) # 页面 点击SQL监控菜单:可以查看后台程序执行的sql语句所耗的时间,时间单位是毫秒。 ![](https://img.kancloud.cn/b2/9c/b29c8d6c7ef8285851d475e530add4cd_959x80.png) 时间分布显示\[0,1,0,0,0,0,0,0\]是什么意思? 第一个0代表这个SQL有0次执行耗时0-1毫秒 第二个1代表这个SQL有1次执行耗时1-10毫秒,也就是我们这里唯一的一次 第三个0代表这个SQL有0次执行耗时10-100毫秒 以此类推,越右边的数字代表执行SQL时间越长的次数,如果靠右边的数字很大,就必须关注这条SQL了 ~~~ #spring监控,hello.controller是我的控制层包名,也可以是服务层,用逗号分隔多个监控内容 spring.datasource.druid.aop-patterns=hello.controller.* ~~~ spring监控:和SQL监控类似,我配置的是监控控制层,所以显示的是控制层执行的时间分布 数据源:显示当前连接池的参数配置,页面右上角有中英文切换,可以对照着查看说明 SQL防火墙:防御SQl攻击,拦截SQL请求