1.springboot默认连接池

习惯使用springboot的小伙伴通过开始学习springboot链接数据库时,都会尝试着官方文档来 学习,所以springboot默认支持的数据库连接池c3p0和 dhcp,大家应该都很熟悉了吧,只需要在.propeties文件中配置下数据库连接字符串即可,默认采用c3p0链接池进行连接数据库,但是今天我着重记录的并非官方默认支持的链接池,而是集成性能不错的阿里数据源druid。

2.阿里连接池druid介绍
druid中文文档 | druid项目

Druid介绍

Druid是一个JDBC组件,druid 是阿里开源在 github 上面的数据库连接池,它包括三部分: 
* DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系。 
* DruidDataSource 高效可管理的数据库连接池。 
* SQLParser 专门解析 sql 语句

Druid 有什么优点?
1. 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 
2. 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 
3. 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。 
4. SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 
5. 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件

3.druid加解密浅析
首先我们来看下 druid加密的过程
通过命令:

java -cp druid-1.0.16.jar com.alibaba.druid.filter.config.ConfigTools you_password

返回值如下:publickey代表公钥,privatekey是密码加密后的结果
  1. privateKey:MIIBVgIBADANBgkqhkiG9w0BAQEFAASCAUAwggE8AgEAAkEA6+4avFnQKP+O7bu5YnxWoOZjv3no4aFV558HTPDoXs6EGD0HP7RzzhGPOKmpLQ1BbA5viSht+aDdaxXp6SvtMQIDAQABAkAeQt4fBo4SlCTrDUcMANLDtIlax/I87oqsONOg5M2JS0jNSbZuAXDv7/YEGEtMKuIESBZh7pvVG8FV531/fyOZAiEA+POkE+QwVbUfGyeugR6IGvnt4yeOwkC3bUoATScsN98CIQDynBXC8YngDNwZ62QPX+ONpqCel6g8NO9VKC+ETaS87wIhAKRouxZL38PqfqV/WlZ5ZGd0YS9gA360IK8zbOmHEkO/AiEAsES3iuvzQNYXFL3x9Tm2GzT1fkSx9wx+12BbJcVD7AECIQCD3Tv9S+AgRhQoNcuaSDNluVrL/B/wOmJRLqaOVJLQGg==
  2. publicKey:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAOvuGrxZ0Cj/ju27uWJ8VqDmY7956OGhVeefB0zw6F7OhBg9Bz+0c84RjzipqS0NQWwOb4kobfmg3WsV6ekr7TECAwEAAQ==

通过加密时使用的命令我们不难看出druid对数据库密码加解密用的是configFilter这个类,所以在配置数据源链接时务必将该filter添加上,否则始终会抛出数据库连接异常,而druid是有重试机制的,默认重试30次,如果数据库做了限制频繁账号尝试连接的话,该账号有可能被锁定,导致线上数据库写入出现问题,所以缺了这样的配置实用加密连接还是蛮恐怖的,直接影响线上环境。

4.springboot使用druid(废话少说直接上代码)
首先加入依赖如下:针对该依赖配置信息(由于springboot未能全面支持druid 所以需要配置datasource)
  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid</artifactId>
  4. <version>1.0.20</version>
  5. </dependency>
  1. # 驱动配置信息
  2. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  3. spring.datasource.url = jdbc:mysql://127.0.0.1:3306/myspringboot
  4. spring.datasource.username = your account
  5. spring.datasource.password = your encryt password
  6. spring.datasource.driverClassName = com.mysql.jdbc.Driver
  7. # 连接池的配置信息
  8. # 初始化大小,最小,最大
  9. spring.datasource.initialSize=5
  10. spring.datasource.minIdle=5
  11. spring.datasource.maxActive=20
  12. # 配置获取连接等待超时的时间
  13. spring.datasource.maxWait=60000
  14. # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  15. spring.datasource.timeBetweenEvictionRunsMillis=60000
  16. # 配置一个连接在池中最小生存的时间,单位是毫秒
  17. spring.datasource.minEvictableIdleTimeMillis=300000
  18. spring.datasource.validationQuery=SELECT 1 FROM DUAL
  19. spring.datasource.testWhileIdle=true
  20. spring.datasource.testOnBorrow=false
  21. spring.datasource.testOnReturn=false
  22. # 打开PSCache,并且指定每个连接上PSCache的大小
  23. spring.datasource.poolPreparedStatements=true
  24. spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
  25. # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
  26. spring.datasource.filters=config,stat,wall,log4j
  27. # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
  28. spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrpt=true;config.decrypt.key=your public key
  1. /**
  2. * Created by wk on 2018/1/10.
  3. */
  4. @Configuration
  5. @ConfigurationProperties(prefix="spring.datasources")
  6. public class DataSourceConfig {
  7. private Logger logger = LoggerFactory.getLogger(DataSourceConfig.class);
  8. private String type;
  9. private String url;
  10. private String driverClassName;
  11. private String username;
  12. private String password;
  13. private Integer initialSize;
  14. private Integer minIdle;
  15. private Integer maxActive;
  16. private Integer maxWait;
  17. private Integer timeBetweenEvictionRunsMillis;
  18. private Integer minEvictableIdleTimeMillis;
  19. private String validationQuery;
  20. private Boolean testWhileIdle;
  21. private Boolean testOnBorrow;
  22. private Boolean testOnReturn;
  23. private Boolean poolPreparedStatements;
  24. private Integer maxPoolPreparedStatementPerConnectionSize;
  25. private String filters;
  26. private String connectionProperties;
  27. public String getDriverClassName() {
  28. return driverClassName;
  29. }
  30. public void setDriverClassName(String driverClassName) {
  31. this.driverClassName = driverClassName;
  32. }
  33. public String getType() {
  34. return type;
  35. }
  36. public void setType(String type) {
  37. this.type = type;
  38. }
  39. public String getUrl() {
  40. return url;
  41. }
  42. public void setUrl(String url) {
  43. this.url = url;
  44. }
  45. public String getUsername() {
  46. return username;
  47. }
  48. public void setUsername(String username) {
  49. this.username = username;
  50. }
  51. public String getPassword() {
  52. return password;
  53. }
  54. public void setPassword(String password) {
  55. this.password = password;
  56. }
  57. public Integer getInitialSize() {
  58. return initialSize;
  59. }
  60. public void setInitialSize(Integer initialSize) {
  61. this.initialSize = initialSize;
  62. }
  63. public Integer getMinIdle() {
  64. return minIdle;
  65. }
  66. public void setMinIdle(Integer minIdle) {
  67. this.minIdle = minIdle;
  68. }
  69. public Integer getMaxActive() {
  70. return maxActive;
  71. }
  72. public void setMaxActive(Integer maxActive) {
  73. this.maxActive = maxActive;
  74. }
  75. public Integer getMaxWait() {
  76. return maxWait;
  77. }
  78. public void setMaxWait(Integer maxWait) {
  79. this.maxWait = maxWait;
  80. }
  81. public Integer getTimeBetweenEvictionRunsMillis() {
  82. return timeBetweenEvictionRunsMillis;
  83. }
  84. public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) {
  85. this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis;
  86. }
  87. public Integer getMinEvictableIdleTimeMillis() {
  88. return minEvictableIdleTimeMillis;
  89. }
  90. public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) {
  91. this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis;
  92. }
  93. public String getValidationQuery() {
  94. return validationQuery;
  95. }
  96. public void setValidationQuery(String validationQuery) {
  97. this.validationQuery = validationQuery;
  98. }
  99. public Boolean getTestWhileIdle() {
  100. return testWhileIdle;
  101. }
  102. public void setTestWhileIdle(Boolean testWhileIdle) {
  103. this.testWhileIdle = testWhileIdle;
  104. }
  105. public Boolean getTestOnBorrow() {
  106. return testOnBorrow;
  107. }
  108. public void setTestOnBorrow(Boolean testOnBorrow) {
  109. this.testOnBorrow = testOnBorrow;
  110. }
  111. public Boolean getTestOnReturn() {
  112. return testOnReturn;
  113. }
  114. public void setTestOnReturn(Boolean testOnReturn) {
  115. this.testOnReturn = testOnReturn;
  116. }
  117. public Boolean getPoolPreparedStatements() {
  118. return poolPreparedStatements;
  119. }
  120. public void setPoolPreparedStatements(Boolean poolPreparedStatements) {
  121. this.poolPreparedStatements = poolPreparedStatements;
  122. }
  123. public Integer getMaxPoolPreparedStatementPerConnectionSize() {
  124. return maxPoolPreparedStatementPerConnectionSize;
  125. }
  126. public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) {
  127. this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize;
  128. }
  129. public String getFilters() {
  130. return filters;
  131. }
  132. public void setFilters(String filters) {
  133. this.filters = filters;
  134. }
  135. public String getConnectionProperties() {
  136. return connectionProperties;
  137. }
  138. public void setConnectionProperties(String connectionProperties) {
  139. this.connectionProperties = connectionProperties;
  140. }
  141. @Bean
  142. public ServletRegistrationBean druidServlet() {
  143. ServletRegistrationBean reg = new ServletRegistrationBean();
  144. reg.setServlet(new StatViewServlet());
  145. reg.addUrlMappings("/druid/*");
  146. reg.addInitParameter("loginUsername", username);
  147. reg.addInitParameter("loginPassword", password);
  148. return reg;
  149. }
  150. @Bean
  151. public FilterRegistrationBean filterRegistrationBean() {
  152. FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
  153. filterRegistrationBean.setFilter(new WebStatFilter());
  154. filterRegistrationBean.addUrlPatterns("/*");
  155. filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
  156. filterRegistrationBean.addInitParameter("profileEnable", "true");
  157. return filterRegistrationBean;
  158. }
  159. @Bean
  160. @Primary
  161. public DataSource druidDataSource() {
  162. DruidDataSource datasource = new DruidDataSource();
  163. datasource.setUrl(url);
  164. datasource.setUsername(username);
  165. datasource.setPassword(password);
  166. datasource.setDriverClassName(driverClassName);
  167. datasource.setInitialSize(initialSize);
  168. datasource.setMinIdle(minIdle);
  169. datasource.setMaxActive(maxActive);
  170. datasource.setMaxWait(maxWait);
  171. datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
  172. datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
  173. datasource.setValidationQuery(validationQuery);
  174. datasource.setTestWhileIdle(testWhileIdle);
  175. datasource.setTestOnBorrow(testOnBorrow);
  176. datasource.setTestOnReturn(testOnReturn);
  177. String paramArray[] = connectionProperties.split(";");
  178. datasource.setConnectionProperties(connectionProperties);
  179. try {
  180. datasource.setFilters(filters);
  181. } catch (SQLException e) {
  182. logger.error("druid configuration initialization filter", e);
  183. }
  184. return datasource;
  185. }
  186. }
2.或者直接用druid-spring-boot-starter druid-spring-boot-starter项目
  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>druid-spring-boot-starter</artifactId>
  4. <version>1.1.0</version>
  5. </dependency>
######Druid数据源配置######
  # JDBC配置
  spring.datasource.druid.url= # 或spring.datasource.url=
  spring.datasource.druid.username= # 或spring.datasource.username=
  spring.datasource.druid.password= # 或spring.datasource.password=
  spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=
   
  # 连接池配置,下面配置说明请参考Druid Github Wiki,配置_DruidDataSource参考配置
  spring.datasource.druid.initial-size=
  spring.datasource.druid.max-active=
  spring.datasource.druid.min-idle=
  spring.datasource.druid.max-wait=
  spring.datasource.druid.pool-prepared-statements=
  spring.datasource.druid.max-pool-prepared-statement-per-connection-size=
  spring.datasource.druid.max-open-prepared-statements= #等价于上面的max-pool-prepared-statement-per-connection-size
  spring.datasource.druid.validation-query=
  spring.datasource.druid.validation-query-timeout=
  spring.datasource.druid.test-on-borrow=
  spring.datasource.druid.test-on-return=
  spring.datasource.druid.test-while-idle=
  spring.datasource.druid.time-between-eviction-runs-millis=
  spring.datasource.druid.min-evictable-idle-time-millis=
  spring.datasource.druid.max-evictable-idle-time-millis=
  spring.datasource.druid.filters= #默认值stat,配置多个英文逗号分隔
  ...
  # 更多配置属性见 DruidDataSource 内成员变量(只要有set方法便支持),或者根据IDE提示,或者查看官方文档
   
  ######Druid监控配置######
  #下面配置说明请参考Druid Github Wiki,配置_配置WebStatFilter
  spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值true
  spring.datasource.druid.web-stat-filter.url-pattern=
  spring.datasource.druid.web-stat-filter.exclusions=
  spring.datasource.druid.web-stat-filter.session-stat-enable=
  spring.datasource.druid.web-stat-filter.session-stat-max-count=
  spring.datasource.druid.web-stat-filter.principal-session-name=
  spring.datasource.druid.web-stat-filter.principal-cookie-name=
  spring.datasource.druid.web-stat-filter.profile-enable=
  #下面配置说明请参考Druid Github Wiki,配置_StatViewServlet配置
  spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet默认值true
  spring.datasource.druid.stat-view-servlet.url-pattern=
  spring.datasource.druid.stat-view-servlet.reset-enable=
  spring.datasource.druid.stat-view-servlet.login-username=
  spring.datasource.druid.stat-view-servlet.login-password=
  spring.datasource.druid.stat-view-servlet.allow=
  spring.datasource.druid.stat-view-servlet.deny=
  #下面配置说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
  spring.datasource.druid.aop-patterns= #Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
  #如果spring.datasource.druid.aop-patterns要代理的类没有定义interface请设置spring.aop.proxy-target-class=true

原文连接:https://blog.csdn.net/ikownyou/article/details/79022560

SpringBoot使用druid的密码加密相关推荐

  1. druid ssh加密 java mysql_springboot 整合druid数据库密码加密功能的实现代码

    在之前给大家介绍过Springboot Druid 自定义加密数据库密码的几种方案,感兴趣的朋友可以点击查看下,今天通过本文给大家介绍springboot 整合druid数据库密码加密功能,具体内容如 ...

  2. SpringBoot Druid数据库密码加密

    废话不多说,直接贴代码,毕竟搜这个的就是想知道怎么搞. 1. 依赖 <dependency><groupId>com.alibaba</groupId><ar ...

  3. Druid数据库密码加密 包含单数据源密码加密,多数据源密码加密详细配置

    发个牢骚 网上虽然有很多相关文章,但是我各种翻看文章依然是各种bug层出不穷,所幸最后终于摸索出了答案,我的第一篇博客应运而生.. 开工 别慌,看到我这篇文章,你的问题就迎刃而解了 一.获取公钥和加密 ...

  4. Springboot 配置文件中用户名密码加密

    原配置文件内容 详细操作步骤 1.在pom.xml文件中加依赖 <!--明文加密--><dependency><groupId>com.github.ulisesb ...

  5. springboot默认数据源如何设置连接数_spring boot基于DRUID数据源密码加密及数据源监控实现...

    项目源码路径:https://github.com/Syske/learning-dome-code.git 前言 随着需求和技术的日益革新,spring boot框架是越来越流行,也越来越多地出现在 ...

  6. druid 连接池的释放 配合上spring bean销毁_spring boot基于DRUID数据源密码加密及数据源监控实现...

    项目源码路径:https://github.com/Syske/learning-dome-code.git 前言 随着需求和技术的日益革新,spring boot框架是越来越流行,也越来越多地出现在 ...

  7. mysql数据库druid密码加密_SpringBoot使用Druid数据库密码加密

    java -cp druid-1.0.28.jar com.alibaba.druid.filter.config.ConfigTools pcds123123456 2.使用 Durid 的工具类 ...

  8. SpringBoot+Shiro实现MD5密码加密认证

    一.数据库实体类 数据库实体类要包括用户ID.密码.盐值以及账户状态. username password salt status 二.自定义Realm /*** Shiro自定义Realm*/ pu ...

  9. druid 数据库密码加密

    druid ConfigFilter wiki文档 https://github.com/alibaba/druid/wiki/%E4%BD%BF%E7%94%A8ConfigFilter 生成密钥 ...

最新文章

  1. torch学习笔记(二) nn类结构-Linear
  2. tensorflow中Tensorboard的用法
  3. 自定义cacti插件监控jvm
  4. windows上搭建python+gvim开发环境
  5. C++ int与string的相互转换(含源码实现)
  6. 蓝桥杯-合并石子(java)
  7. Android笔记(六十七) 自定义控件
  8. 阿里云API网关(18)请求报文和响应报文
  9. 实验一 命令解释程序的编写
  10. Netty工作笔记0026---NIO 网络编程应用--群聊系统1---编写服务器1
  11. WDA基础七:TABStrip
  12. [小问题笔记(八)] 常用SQL(读字段名,改字段名,打印影响行数,添加默认值,查找存储过程等)...
  13. 中缀表达式转化成后缀表达式
  14. 计算机图形学课本pdf,计算机图形学教材.pdf
  15. C语言零基础入门级学习程序框架【系统学习第一天】
  16. Visio 流程图的箭头 设置
  17. 找回HDFS corrupted文件残留数据
  18. 使用marmaid让mrakdown支持作图
  19. 初中计算机卡片的制作教案,《运用Word制作电子贺卡》教学设计
  20. 符号的英文读法(转)

热门文章

  1. 8421码 2421码 5421码和余3码的使用
  2. 当迅雷显示“文件路径超出系统限制”时怎么办
  3. wx小程序工具下载及安装
  4. MIT Technology Review 2022年“全球十大突破性技术”解读
  5. No property creategoryType found for type xxx! Did you mean ‘xxx‘?
  6. 如何解决微信端不能直接跳转浏览器
  7. 人脸识别-Loss-2010:Softmax Loss(Softmax激活函数 + “交叉熵损失函数”)【样本3真实标签为c_5,则样本3的损失:loss_3=-log(\hat{y}_5^3)】
  8. 解析少儿编程中的运用的科技语言
  9. 常见的手机端头部banner切换代码设置
  10. 高仿QQ的手机管家的小火箭加速