<p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2FNsXa%3DXOX4VD9wGuEAXzZpym0jPoVpjc91RjGB7XoesQyB93.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p><strong>如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,获取最新干货推送:)</strong><br/></p><p><blockquote>在上一篇文章《Spring Boot (三): ORM 框架 JPA 与连接池 Hikari》 我们介绍了 JPA 与连接池 Hikari 的整合使用,在国内使用比较多的连接池还有一个是阿里开源的 Druid 。本篇文章我们就来聊一聊 Druid 的一些使用姿势。<br/></blockquote></p><p>1. Druid 是什么?</p><p>我们先来看一下官方的回答:</p><p><blockquote>Druid 是 Java 语言中最好的数据库连接池。 Druid 能够提供强大的监控和扩展功能。<br/></blockquote></p><p>说 Druid 是 Java 语言中最好的数据库连接池,这个笔者个人觉得有些吹牛了,至少在性能上和我们上一篇介绍的 Hikari 是没得比的,相关的性能测试在网上能找到很多,笔者这边就不列举了。但是 Druid 在其他的一些方面就做的比较出色了,功能非常丰富:</p><p><ul><li>可以监控数据库访问性能, Druid 内置提供了一个功能强大的StatFilter插件,能够详细统计 SQL 的执行性能,这对于线上分析数据库访问性能有帮助。</li><li>数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。 DruidDruiver 和 DruidDataSource 都支持 PasswordCallback 。</li><li>SQL 执行日志, Druid 提供了不同的 LogFilter ,能够支持 Common-Logging 、 Log4j 和 JdkLog ,你可以按需要选择相应的 LogFilter ,监控你应用的数据库访问情况。</li><li>扩展 JDBC ,如果你要对 JDBC 层有编程的需求,可以通过 Druid 提供的 Filter 机制,很方便编写 JDBC 层的扩展插件。</li></ul></p><p>2. Spring Boot 应用中如何使用</p><p>目前 Druid 官方为我们提供了两种使用依赖方式,一种是基于传统 Java 工程提供的依赖包, maven 坐标如下:</p><p></p><p>还有一种是基于 Spring Boot 提供的依赖包, maven 坐标如下:</p><p></p><p>下面的这种依赖包除了包含了上面的那种 Druid 基础包,还包含了 Spring Boot 自动配置的依赖包以及 sl4j-api ,我们在 Spring Boot 中使用 Druid ,当然是推荐各位读者使用第二种方式引入依赖。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2Fs6vBUHXXCqbkNlpnnv352KWBcVp2YZmtHVrVzPbAiI5Z690.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>3. 工程实战</p><p>3.1 创建父工程 spring-boot-jpa-druid</p><p>父工程 pom.xml 如下:</p><p>代码清单:spring-boot-jpa-druid/pom.xml</p><p></p><p><ul><li>笔者这里使用的 Druid 依赖包是 ,版本号为 1.1.20。</li></ul></p><p>3.2 数据库密码不加密的配置文件 application-pass.yml 如下:</p><p>代码清单:spring-boot-jpa-druid/src/main/resources/application-pass.yml</p><p></p><p><ul><li>相关配置的含义已经写在注释中了,这里有一点要讲一下,当我们要配置统计信息(包括监控信息) 输出至日志中,合并多个DruidDataSource的监控数据 不可开启,否则启动会报错。</li><li> :因为 Druid 的扩展是通过 Filter 插件的形式来开启的,这里我们开启了 和 ,这俩个分别为监控和防御 SQL 注入攻击。 Druid 还提供了一些其他默认的 Filter ,如下表:</li></ul>Filter类名别名defaultcom.alibaba.druid.filter.stat.StatFilterstatcom.alibaba.druid.filter.stat.StatFiltermergeStatcom.alibaba.druid.filter.stat.MergeStatFilterencodingcom.alibaba.druid.filter.encoding.EncodingConvertFilterlog4jcom.alibaba.druid.filter.logging.Log4jFilterlog4j2com.alibaba.druid.filter.logging.Log4j2Filterslf4jcom.alibaba.druid.filter.logging.Slf4jLogFiltercommonloggingcom.alibaba.druid.filter.logging.CommonsLogFilterwallcom.alibaba.druid.wall.WallFilter</p><p>从名称上可以看出来,主要是一些编码和日志的相关 Filter 。</p><p>3.3 数据库密码加密</p><p>在生产环境中,直接在配置文件中暴露明文密码是一件非常危险的事情,出于两点考虑:对外,即使应用服务被入侵,数据库还是安全的;对内,生产环境的数据库密码理论上应该只有 dba 知道,但是代码都是在代码仓库中放着的,如果密码没有加密,每次发布前 dba 都需要手动修改配置文件后再进行打包编译。</p><p>首先,我们需要生成数据库密码的密文,需要在命令行中执行如下命令:</p><p></p><p>输出如下:</p><p></p><p></p><p></p><p></p><p></p><p>这里我们需要将生成的公钥 和密码 加入配置文件中, 如下:</p><p>代码清单:spring-boot-jpa-druid/src/main/resources/application-decrypt.yml</p><p></p><p></p><p></p><p><ul><li>已省略部分配置,有需要的读者可以访问 Github 仓库获取。</li></ul></p><p>3.4 配置文件 如下:</p><p>代码清单:spring-boot-jpa-druid/src/main/resources/application.yml</p><p></p><p>其余的测试代码同上一篇文章《Spring Boot (三): ORM 框架 JPA 与连接池 Hikari》,有兴趣的读者可以访问 Github 仓库获取,笔者这里就不一一列举了。</p><p>4. 测试</p><p>我们在主配置文件中,选择密码加密的配置文件启动,将 配置为 ,点击启动,可以看到工程正常启动,查看控制台输出日志,其中有这么一句:</p><p></p><p>可以看到,我们配置的监控信息输出会在系统启动的时候先输出一次,我们在配置文件中配置的是每5分钟输出一次,等十分钟看一下控制台的输出信息,结果如下:</p><p></p><p></p><p></p><p></p><p></p><p>从时间上可以看出,确实是每5分钟会输出一次。</p><p>打开浏览器访问:http://localhost:8080/druid/ ,查看 Druid 监控页面,结果如图:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2FVuF1KaKDgh465qzOLGH%3DNQBsNB5HVzplqSlAdxZ1wl3FC93compressflag.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>我们可以进行一些接口测试,在查看监控页面,可以看到所有的 SQL 都正常记录,如图:</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2FIz64B4TJYRI2tfdHEsZeX7EvoHJHMQpDCPUtXGhx66YmJ95.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2FpKFzeLv9pI4iPwY9sn82gbYVEF2CmVAM94t1gUihnxWYt93compressflag.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F6G40TrNR9lSAdnVq8zES9f44B74xzlBZouM%3DmnlIdbCgA95compressflag.png&thumbnail=660x&quality=80&type=jpg"/><br/></p><p>同时,我们看一下后台的日志打印,是否正常打出记录的日志,截取打印部分,如下:</p><p></p><p>可以看到,日志中打印了我们执行的 SQL 相关的信息,和我们在监控页面看到的信息完全一致。</p><p>至此,测试成功,篇幅原因,一些测试过程未列出,各位感兴趣的读者朋友可以自己动手尝试一下。</p><p>5. 示例代码</p><p>示例代码-Github:</p><p>https://github.com/meteor1993/spring-boot-examples/tree/master/spring-boot-jpa-druid</p><p>示例代码-Gitee:</p><p>https://gitee.com/inwsy/spring-boot-examples/tree/master/spring-boot-jpa-druid</p><p>6. 参考</p><p>《Druid 官方文档》:</p><p>https://github.com/alibaba/druid/wiki</p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/152944.html