SpringBoot持久化与Druid+JDBC集成

转自SpringBoot与Druid+JDBC整合

往期回顾

第一章:现在是JAVA程序员必须学习Spring Boot的时候

1.1 Spring Boot发展介绍

第二章、Spring Boot基础知识

Spring Boot 基础之YAML配置文件

第三章:SpringBoot自动装配原理解析

 1、概要

SpringBoot持久化包括与数据源、JDBC、Mybatis、JPA的整合,而数据源包括与HikariCP和Druid的集成。本章围绕以下三个方面展开:

SpringBoot 2.0默认数据库连接池为什么选择HiKariCPSpringBoot与JDBC的集成方案SpringBoot与Druid的集成方案

1、SpringBoot 2.0默认数据库连接池为什么选择HiKariCP

Spring-Boot-2.0.0-M1版本将默认的数据库连接池从tomcat jdbc pool改为了HikariCP。

HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池,是一个高性能的JDBC连接池,基于BoneCP做了不少的改进和优化。

题外话其作者还有另外一个开源作品——高性能的JSON解析器HikariJSON,超快,快到连Spring Boot 2都宣布支持了,代码体积更是少的可怜,130kb。

1.1、为何要使用HiKariCP?

这要先从BoneCP说起,一直都是C3P0/DBCP这些成熟的数据库连接是企业首选,为什么又搞出一个BoneCP来?因为,传说BoneCP在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右。

讨论BoneCP这块的内容之前,我们还是先来看看BoneCP作者自己是这么评价这款产品的:

BoneCP is a Java JDBC connection pool implementation that is tuned for high performance by minimizing lock contention to give greater throughput for your applications. It beats older connection pools such as C3P0 and DBCP but should now be considered deprecated in favour of HikariCP.

翻译:BoneCP是一个高性能的数据库连接池,这归因于BoneCP在实现的时候减少了锁的使用,BoneCP打败了c3p0和DBCP数据库连接池,但是现在为了支持HikariCP,BoneCP考虑废弃!

也就是说,BoneCP的退出是它自己的选择,它是作者经过深思熟虑后,做出的选择。那么问题来了,BoneCP究竟是不是像它自己形容的那样牛逼?BoneCP和HikariCP之间究竟有啥联系,能引得它主动“金盆洗手”?

先说性能,BoneCP自称性能是c3p0的25倍,并提供了依照自己定义的测试案例,提供了一组图片:

单线程(1,000,000获得及释放数据库连接请求,连接池大小20-50)

单线程/1,000,000获得及释放链接

多线程(500线程分别获取释放100个链接,连接池大小50-200)

500线程分别获取释放100个链接

多线程(500个线程每个100次获得/释放,连接池大小20-500)

500个线程每个100次获得/释放

从上述结果可以看出HikariCP的性能远高于c3p0、tomcat等连接池。

值得一提的是,BoneCP本身并不“健全”,它的很多特征都依赖于Guava,因此也就和dbcp一样,面临更新乏力的问题。但现在,这些问题都不重要了,因为它赖以为傲的性能被HikariCP全面超越。HikariCP可以说是BoneCP的二代产品(HikariCP自己在官网上声称在BoneCP的基础上,做了很多优化),它在设计思路上和BoneCP完全一致,主打的特征也是超强的性能表现。

1.2、第二代连接池

在数据库连接池的产品群中,二代产品对一代产品的超越是颠覆性的,除了一些“历史原因”,你很难再找到第二条理由说服自己不选择二代产品,但任何成功都不是偶然的,二代产品的成功很大程度上得益于前代产品们打下的基础,站在巨人的肩膀上,新一代的连接池的设计师们将这一项“工具化”的产品,推向了极致。其中,最具代表性的两款产品是:

HikariCPDruid【dru:d】1.2.1、性能无敌的HikariCP,那它是怎么做到如此强劲的呢?看如下官方的测试表现:

各个数据库的对此

不光性能强劲,稳定性也不差:

HikariCP的稳定性

HikariCP能有如此强劲的呢,官网给出的解释如下:

字节码精简:优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;自定义集合类型(ConcurrentBag):提高并发读写的效率;其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化)1.2.2、功能全面的druid近几年,阿里在开源项目上动作频频,除了有像fastJson这类工具型项目,更有像AliSQL这类的大型软件,今天说的druid,就是阿里众多优秀开源项目中的一个。它除了提供性能卓越的连接池功能外,还集成了sql监控,黑名单拦截等功能,用它自己的话说,druid是“为监控而生”。借助于阿里这个平台的号召力,产品一经发布就赢得了大批用户的拥趸,从用户使用的反馈来看,druid也确实没让用户失望。

相较于其他产品,druid另一个比较大的优势,就是中文文档比较全面(毕竟是国人的项目么,大家可以在githup上搜索)。

2 、SpringBoot与JDBC的集成方案

直接在 Java 程序中使用 JDBC 操作数据库步骤比较复杂,大概需要 7 步才能完成数据库的操作:

加载数据库驱动获取数据库链接,后者使用数据库连接池创建PrepareStatement对象编写SQL执行数据库操作:Delete、Insert、Update获取并操作结果集:ResultSet关闭对象,try、catch、finallySpring Boot 针对 JDBC 的使用提供了对应的 Starter 包:spring-boot-starter-jdbc,它其实就是在 Spring JDBC 上做了进一步的封装,方便在 Spring Boot 生态中更好的使用 JDBC。

2.1.1、上手搭建工程

第一步:添加依赖POM

第二步:建立演示工程bank-springboot-base-db-jdbc,使用Mysql作为数据库

SpringBoot JDBC演示工程

需要提前准备数据:

第三步:在resources中创建application.yml文件,配置数据库信息

这样的配置,默认使用HikariDataSource数据源,com.zaxxer.hikari.HikariDataSource。

注意:Loading class com.mysql.jdbc.Driver This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver,The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.1、官方文档说的已经很清楚了,com.mysql.jdbc.Driver已经被废弃,要使用新的jdbc驱动程序:com.mysql.cj.jdbc.Driver,并且该驱动可以被自动加载,手动加载是没必要的。所以我们的application.properties无需在为mysql指定驱动类了。 以上可以在JDBC官方文档找到答案。2、在 Spring Boot 2.1.0 中,com.mysql.jdbc.Driver 已经过期。

第四步:实体类Account

第五步:@Repository 注解标注数据访问层,AccountRepository封装常用的CRUD操作:

AccountRepositoryImpl是默认实现:

类上使用 @Repository 注解用于标注数据访问组件,同时在类中注入 JdbcTemplate,其是 Spring 操作 JDBC 提供的工具类。

第六步:controller代码,通过Http发起访问请求

提供可以直接从浏览器发起操作的接口,类AccountController使用@RestController注解:

AccountController

接口insertAccount.do新增一个账户,

接口queryAccount.do根据acno查询账户信息。

第七步:启动代码,通过接口访问

启动代码

插入数据:

接口insertAccount.do新增一个账户

查询账户信息:

接口queryAccount.do根据acno查询账户

3、SpringBoot与Druid的集成方案

Druid 单词来源于西方古罗马的神话人物,中文常常翻译成德鲁伊,本文讨论的Druid是阿里开源的Java语言中最好的数据库连接池,Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过阿里多年生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!

Druid 首先是一个数据库连接池,但它不仅仅是一个数据库连接池,还包含了一个 ProxyDriver,一系列内置的 JDBC 组件库,一个 SQL Parser。在 Java 的世界中 Druid 是监控做的最好的数据库连接池,在功能、性能、扩展性方面,也有不错的表现。

3.1、Spring Boot 集成 Druid

非常令人高兴的是,阿里为 Druid 也提供了 Spring Boot Starter 的支持。官网这样解释:Druid Spring Boot Starter 用于帮助你在 Spring Boot 项目中轻松集成 Druid 数据库连接池和监控。

Druid Spring Boot Starter 主要做了哪些事情呢?其实这个组件包很简单,主要提供了很多自动化的配置,按照 Spring Boot 的理念对很多内容进行了预配置,让我们在使用的时候更加的简单和方便。

引入依赖包

druid-spring-boot-starter 的最新版本为 1.1.10,会自动依赖 Druid 相关包。application 配置

Druid Spring Boot Starter 配置属性的名称完全遵照 Druid,可以通过 Spring Boot 配置文件来配置 Druid 数据库连接池和监控,如果没有配置则使用默认值。

在以前项目的基础上,增加了对 Druid 连接池的配置,以及 SQL 监控的配置,druid-spring-boot-starter 默认情况下开启 StatFilter 的监控功能。Druid Spring Boot Starter 不限于对以上配置属性提供支持,DruidDataSource 内提供 setter 方法的可配置属性都将被支持。

配置完成后,直接启动项目访问地址druid地址,就会出现 Druid 监控后台的登录页面,输入账户和密码后,就会进入首页。

请求地址为/druid

首页会展示项目使用的 JDK 版本、数据库驱动、JVM 相关统计信息。根据上面的菜单可以看出 Druid 的功能非常强大,支持数据源、SQL 监控、SQL 防火墙、URI 监控等很多功能。

启动工程,操作与“SpringBoot与JDBC的集成方案”一样。

3.2、直接集成Druid,不使用druid-spring-boot-starter

在哪里下载druid

正式版本下载,maven中央仓库

添加yml配置属性,这些属性都是spring.datasource下的子属性

手动配置Druid数据源

添加druid的配置类文件:DruidConfiguration.java

DruidConfiguration配置Druid数据源

启动工程,操作与“SpringBoot与JDBC的集成方案”一样。

从这个例子可发现,使用 Spring Boot 集成 Druid 非常的简单,只需要添加依赖,简单配置就可以。

总结

SpringBoot的JDBC操作,建议使用Druid数据源。

Druid 是一款非常优秀的数据库连接池开源软件,使用 Druid 提供的 druid-spring-boot-starter 可以非常简单地对 Druid 进行集成。Druid 提供了很多预置的功能,非常方便我们对 SQL 进行监控、分析。Druid 对 Spring Boot 2.0 的支持还不够完善,对于使用 Druid 的特殊场景,可以使用 Druid 原生包自行进行封装。

转自SpringBoot与Druid+JDBC整合 

猜你喜欢

转载自blog.csdn.net/jack339083590/article/details/89236517