前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >玩转 Spring Boot 集成篇(MySQL、Druid、HikariCP)

玩转 Spring Boot 集成篇(MySQL、Druid、HikariCP)

作者头像
一猿小讲
发布2022-02-25 09:39:36
1.6K0
发布2022-02-25 09:39:36
举报
文章被收录于专栏:一猿小讲一猿小讲

Spring Boot 横扫 Java 程序员在使用 Spring 研发路上的诸多障碍,让研发人员更加专注于业务逻辑的开发,使得企业级项目开发更加快速和高效。

为什么这么说呢?

这要归功于 Spring Boot 提供了满足研发场景的各种 starter,所谓 starter 就是把项目研发中所需的组件或服务进行封装成包,开箱即用,屏蔽了繁琐的配置,使得依赖的组件或服务变的可插拔。

starter 主要分为两种:一种是官方的,一种是三方的。官方与三方的命名方式上不太一样,官方的命名以 spring-boot 开头,而三方的命名以自定义的 xxx 名称开头。

例如,官方的命名:spring-boot-xxx-xxx.jar,而三方的命名:xxx-spring-boot-starter.jar。

本文主要讲解 Spring Boot 与常见开发组件进行整合,感受一下 starter 开箱即用的魔力,深入体验 Spring Boot 的大道至简。

1. Spring Boot 集成 MySQL

借助 Spring Boot 框架,可以不用编写原始的访问数据库的代码,也不用调用 JDBC 或者连接池等诸如此类的被称为底层的代码,就可以在更高级的层次上访问数据库。

Spring Boot 集成 MySQL 非常之简单,只需如下简单的几步。

1.1. 引入依赖

在 pom.xml 中引入访问 MySQL 所需的依赖。

代码语言:javascript
复制
<!-- MySQL 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 通过 JDBC 连接数据库依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

1.2. 添加数据库配置

在 application.properties 文件中,添加 MySQL 数据库的连接信息:

代码语言:javascript
复制
# MySQL 链接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

1.3.创建表、插入数据

代码语言:javascript
复制
-- ----------------------------
-- Table structure for sc_product
-- 商品表
-- ----------------------------
DROP TABLE IF EXISTS `sc_product`;
CREATE TABLE `sc_product` (
  `id` bigint(20) NOT NULL COMMENT '商品id',
  `name` varchar(255) NOT NULL DEFAULT '' COMMENT '商品名称',
  `number` int(11) NOT NULL DEFAULT '0' COMMENT '商品数量',
  `start_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '秒杀开始时间',
  `end_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '秒杀结束时间',
  `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
  `product_img` varchar(255) DEFAULT NULL COMMENT '商品图片',
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of sc_product
-- 插入3条商品记录
-- ----------------------------
INSERT INTO `sc_product` VALUES ('1', '小米11 Pro', '100', '2022-01-21 08:08:08', '2022-02-21 08:08:08', '2022-01-21 00:00:00', '/xiaomi10.jpg');
INSERT INTO `sc_product` VALUES ('2', '小米12 pro', '100', '2022-01-21 08:08:08', '2022-02-21 08:08:08', '2022-01-21 00:00:00', '/xiaomi12.jpg');
INSERT INTO `sc_product` VALUES ('3', '红米10 pro', '100', '2022-01-21 08:08:08', '2022-02-21 08:08:08', '2022-01-21 00:00:00', '/hongmi.jpg');

1.4.创建实体类

代码语言:javascript
复制
import java.io.Serializable;
import java.util.Date;
/**
 * 产品类
 * @author daishu
 */
public class ScProduct implements Serializable {

    private Integer id;
    private String name;
    private String productImg;
    private Integer number;
    private Date startTime;
    private Date endTime;
    private Date createTime;
    
    // 省略 setter/getter 方法
    // 省略 toString 方法
}

1.5.测试验证

  • 上图标注 1:JdbcTemplate 是在引入依赖 spring-boot-starter-jdbc 包中,是通过 JDBC 连接数据库的工具类,可以通过这个工具类对数据库进行 CRUD 等操作。
  • 上图标注 2:编写了 MySQL 集成的测试方法,主要是查询表中的数据,然后输出结果进行验证。

单元测试类跑起来,效果如下。

至此,Spring Boot 项目集成 MySQL 数据库已大功告成。

回头捋捋:

  • 引入 spring-boot-starter-jdbc 依赖以及 mysql 驱动包;
  • 配置了数据库的相关连接信息;
  • 编写了一个实体类(ScProduct)代码;
  • 编写了一个 MySQL 集成的测试方法

三两行代码就完成了 Spring Boot 项目集成数据库,从使用上感觉一切皆是浑然天成,可谓是快哉!

Spring Boot 项目集成数据库就分享到这里,但是如何提高数据库的操作性能呢?

回顾日常实际项目研发,大概率会发现项目很难脱离数据库而单独存在,而提高数据库性能,往往会借助数据库连接池来支持,接下来说说 Spring Boot 如何集成常见的 DataSource 数据源。

2. Spring Boot 集成连接池组件

常见的连接池有 DBCP、C3P0、Tomcat jdbc-pool、Druid、HikariCP。

坊间做过性能验证,得出结论如下:

1:性能方面 HikariCP > Druid > tomcat-jdbc > DBCP > C3P0 ; 2:Driud 功能最为全面,具有良好的扩展性; 3:综合性能,扩展性等方面,可考虑使用 Druid 或 HikariCP 连接池。

接下来重点说说 Spring Boot 集成 Druid 和 HikariCP 连接池。

2.1. Spring Boot 集成 Druid 数据库连接池

Druid 是阿里推出的一款数据库连接池组件,是一个用于大数据实时查询和分析的高容错、高性能开源分布式系统,可高效处理大规模的数据并实现快速查询和分析。

2.1.1. 引入依赖

代码语言:javascript
复制
<!-- 引入 Druid 依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version>
</dependency>

2.1.2. 添加 Druid 配置

代码语言:javascript
复制
# MySQL 链接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源类别
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# 初始化连接数、最小空闲、最大活跃连接数
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 'x'
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
# 打开 PSCache,并且制定每个连接上 PSCache 的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的 filters
spring.datasource.filters=stat,wall,log4j
# 打开 mergeSql 功能;记录慢 SQL 
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个 DruidDataSource 的监控数据
spring.datasource.useGlobalDataSourceStat=true

2.1.3. 开启 Druid 监控功能

代码语言:javascript
复制
package com.example.demo.config;

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DruidConfiguration {

   @Bean
   public ServletRegistrationBean druidServlet() {
      ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
      // IP白名单(没有配置或者为空,则允许所有访问)
      servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
      // IP黑名单(共同存在时,deny优先于allow)
      servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
      //控制台管理用户
      servletRegistrationBean.addInitParameter("loginUsername", "admin");
      servletRegistrationBean.addInitParameter("loginPassword", "admin");
      //是否能够重置数据 禁用HTML页面上的“Reset All”功能
      servletRegistrationBean.addInitParameter("resetEnable", "false");
      return servletRegistrationBean;
   }

   @Bean
   public FilterRegistrationBean filterRegistrationBean() {
      FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
      filterRegistrationBean.addUrlPatterns("/*");
      filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
      return filterRegistrationBean;
   }
}
  • 在 druidServlet 方法中,设定了访问数据库的白名单、黑名单、登录用户名和密码等信息;
  • 在 filterRegistrationBean 方法中,设定了过滤的规则和需要忽略的格式。

2.1.4. 测试集成

运行 DemoApplication 进行服务启动,访问 http://127.0.0.1:8888/druid/login.html(本机服务端口为 8080)

输入 admin/admin 后登陆,效果如下。

此时,可以在 Druid 提供的监控页面上对数据源、SQL、Web应用等等进行监控。当然项目中也就可以采用 Druid 数据库连接池来进行数据库操作了。

至此,Spring Boot 项目集成 Druid 连接池就已完成。

2.2. Spring Boot 集成 HikariCP 连接池

HikariCP 号称史上最快的,在 Spring Boot2.0 版本中,由于 HikariCP 提供了卓越的性能,默认数据库池技术已从 Tomcat jdbc-pool切换到 HikariCP。

2.2.1. 引入依赖

由于 Spring Boot2.0 版本中,已经默认采用 HikariCP 数据库连接池技术,所以不需要单独引入 HikariCP 的依赖,默认情况下 spring-boot-starter-jdbc 或者 spring-boot-starter-data-jpa 会依赖进来。

2.2.2. 添加 HikariCP 配置

代码语言:javascript
复制
# 数据源类别
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# 连接池名字
spring.datasource.hikari.pool-name=GrowUpHikariCP
# 最小空闲连接数量
spring.datasource.hikari.minimum-idle=10
# 空闲连接存活最大时间,默认600000(10分钟)
spring.datasource.hikari.idle-timeout=600000
# 连接池最大连接数,默认是10
spring.datasource.hikari.maximum-pool-size=10
# 此属性控制从池返回的连接的默认自动提交行为,默认值:true
spring.datasource.hikari.auto-commit=true
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
spring.datasource.hikari.max-lifetime=1800000
# 数据库连接超时时间,默认30秒,即30000
spring.datasource.hikari.connection-timeout=30000

由于 HikariCP 是默认依赖,所以以上配置依据实际需要而定,皆非必须配置。

2.2.3. 集成验证

代码语言:javascript
复制
package com.example.demo;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.sql.DataSource;
import java.sql.SQLException;

@SpringBootTest
class DataSourceTests {
    @Autowired
    private DataSource dataSource;
    @Test
    public void hikariDataSourceTest() throws SQLException {
        System.out.println(dataSource.getConnection());
    }
}

程序跑起来,输出如下。

至此,Spring Boot 集成 HikariCP 连接池已完毕,由于 Spring Boot 2.0 版本及以后版本默认都采用 HikariCP 连接池,几乎没有添加什么代码与配置,就轻松使用上了 HikariCP,可谓快哉。

3. 例行回顾

本文是 Spring Boot 项目集成篇的讲解,主要分享了如下部分:

  • Spring Boot 开箱即用的 starter 作用及分类?
  • Spring Boot 项目如何访问数据库?
  • Spring Boot 项目如何集成 Druid 连接池?
  • Spring Boot 项目如何集成 HikariCP 连接池?

玩转 Spring Boot 集成 MySQL、集成常用连接池组件就写到这里,希望大家能够喜欢。一起聊技术、谈业务、喷架构,少走弯路,不踩大坑,会持续输出更多精彩分享

参考资料:

https://spring.io/

https://start.spring.io/

https://spring.io/projects/spring-boot

https://github.com/spring-projects/spring-boot

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

https://stackoverflow.com/questions/tagged/spring-boot

《Spring Boot实战》《深入浅出Spring Boot 2.x》

《一步一步学Spring Boot:微服务项目实战(第二版)》

《Spring Boot揭秘:快速构建微服务体系》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一猿小讲 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档