Druid数据库连接 | Spring Boot 集成 Druid实现数据库连接和完善的SQL执行监控

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 我们知道,应用系统最频繁,最主要的操作还是数据库的操作,所以数据库的性能和安全对于整个系统平台的重要性不言而喻。为了提高数据库性能,我们可以使用数据库连接池,有时候我们需要增加一些列的日志或是数据库性能监控工具来确保数据库的性能,同时还得防范数据库的SQL注入等安全问题。所以,今天我们来介绍一款集数据库连接池、数据库监控、SQL执行日志于一身的神器:Druid。

我们知道,应用系统最频繁,最主要的操作还是数据库的操作,所以数据库的性能和安全对于整个系统平台的重要性不言而喻。为了提高数据库性能,我们可以使用数据库连接池,有时候我们需要增加一些列的日志或是数据库性能监控工具来确保数据库的性能,同时还得防范数据库的SQL注入等安全问题。

所以,今天我们来介绍一款集数据库连接池、数据库监控、SQL执行日志于一身的神器:Druid。

一、Druid简介

Druid 是阿里巴巴开源平台上的一个数据库连接池项目,它结合了 C3P0、DBCP 等数据库池的优点,同时加入了SQL日志和SQL性能监控的功能。可以很好的监控数据库池连接和 SQL 的执行情况,可以说是针对监控而生的数据库连接池框架。

Druid 是目前比较流行的高性能的,分布式列存储的OLAP框架(具体来说是MOLAP)。它有如下几个特点:

1、亚秒级查询:Druid提供了快速的聚合能力以及亚秒级的OLAP查询能力,多租户的设计,是面向用户分析应用的理想方式。

2、实时数据注入:Druid支持流数据的注入,并提供了数据的事件驱动,保证在实时和离线环境下事件的实效性和统一性

3、可扩展的PB级存储:Druid集群可以很方便的扩容到PB的数据量,每秒百万级别的数据注入。即便在加大数据规模的情况下,也能保证时其效性

4、多环境部署:Druid既可以运行在商业的硬件上,也可以运行在云上。它可以从多种数据系统中注入数据,包括hadoop,spark,kafka,storm和samza等

目前 Druid 已经在阿里巴巴部署了超过600个应用,经过生产环境大规模部署的严苛考验。


二、Druid对Spring Boot的支持

Driud 同样对Spring Boot 提供了支持。为Spring Boot项目提供了druid-spring-boot-starter组件,可以帮助我们在Spring Boot项目中轻松集成Druid数据库连接池和监控。

Github地址:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

我们知道 Spring Boot 2.0 以上默认使用 Hikari 数据源,可以说 Hikari 与 Driud 是当前 Java Web 开发中最优秀的数据源。


三、Spring Boot集成Druid

Druid 提供的druid-spring-boot-starter组件可以帮助我们在Spring Boot 项目中轻松集成Druid。下面通过示例演示如何在Spring Boot 项目中集成Druid。

1、引入依赖包

修改pom.xml 文件,引入druid、jdbc等依赖包,具体如下所示:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SPRINGBOOT DRUID -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
        <!-- SPRINGBOOT JDBC -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- MYSQL -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

上面的示例中,我们引入了druid、jdbc、mysql-connector等依赖组件,其中druid的组件包不是Spring Boot 提供,所以版本号与Spring Boot不一致,我们需要单独添加对应的版本号:1.1.10。


2、修改配置文件

接下来,修改application.properties 配置文件,配置数据库连接,Druid等相关配置。具体如下所示:

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url=jdbc:mysql://localhost:3306/druid_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 初始化最大、最⼩、最连接数
spring.datasource.druid.initial-size=3
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=10
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
# 监控后台账号和密码
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=123456
# 配置 StatFilter
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.stat.slow-sql-millis=2000

上面的示例,我们配置了Mysql数据库连接,已经Druid的基础配置和后台监控的账号密码。通过此账号密码,即可登录Druid后台,查看SQL的执行情况。


3、运行验证

前面这两步,我们就把druid集成到Spring Boot项目中了。启动项目访问地址: http://localhost:8080/druid,就会出现 Druid 监控后台的登录页面,输入前面配置的账户和密码后,就会进入首页。

image.png

通过上图可以看到,Druid展示了Spring Boot 项目中使用的 JDK 版本、数据库驱动、 JVM 等相关统计信息,同时还有,数据源、 SQL 监控、 SQL 防火墙、 URI 监控、Session监控等诸多监控功能。从这里也可以看出 Druid 的功能非常强大。



四、Druid+jdbcTemplate实现数据库操作

前面我们在Spring Boot项目中集成了Druid, 操作非常的简单,只需要添加依赖,简单配置即可实现。接下来我们通过Druid+jdbcTemplate实现数据库操作,演示Druid 是如何监控SQL执行的。

1、创建数据库及表

首先,创建druid_test数据库和student 表。具体脚本如下:

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `name` varchar(32) DEFAULT NULL COMMENT '姓名',
  `sex` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('3', 'zhangsan', '1', '20');
INSERT INTO `student` VALUES ('5', 'weiz多数据源', '0', '30');
INSERT INTO `student` VALUES ('6', 'weiz', '1', '30');
INSERT INTO `student` VALUES ('7', 'weiz2', '1', '30');
INSERT INTO `student` VALUES ('10', '李四', '0', '18');
INSERT INTO `student` VALUES ('11', 'weiz11', '1', '23');


2、创建Student实体类

接下来,创建student表对应的Student实体类,示例代码如下:

public class Student {
    private Long id;
    private String name;
    private int sex;
    private int age;
    public Student(){
    }
    public Student(String name, int sex, int age) {
        this.name = name;
        this.sex = sex;
        this.age = age;
    }
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSex() {
        return sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}


3、创建Service 及Impl实现

创建数据库操作的方法StudentRepository及实现StudentRepositoryImpl。具体示例代码如下:

// StudentRepository
public interface StudentRepository {
    int save(Student user);
    int update(Student user);
    int delete(long id);
    Student findById(long id);
}
@Repository
public class StudentRepositoryImpl implements StudentRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public int save(Student user) {
        return jdbcTemplate.update("INSERT INTO Student(name, sex, age) values(?, ?, ?)",
                user.getName(), user.getSex(), user.getAge());
    }
    @Override
    public int update(Student user) {
        return jdbcTemplate.update("UPDATE Student SET name = ? , sex = ? , age = ?  WHERE id=?",user.getName(), user.getSex(), user.getAge(), user.getId());
    }
    @Override
    public int delete(long id) {
        return jdbcTemplate.update("DELETE FROM Student where id = ? ",id);
    }
    @Override
    public Student findById(long id) {
        return jdbcTemplate.queryForObject("SELECT * FROM Student WHERE id=?", new Object[] { id }, new BeanPropertyRowMapper<Student>(Student.class));
    }
}


4、创建Controller调用

最后,创建StudentController,并调用相关的数据操作方法。示例代码如下:

@RestController
@RequestMapping("/student")
public class StudentController {
    @Autowired
    StudentRepository studentRepository;
    @RequestMapping("/findById/{id}")
    public Student findById(@PathVariable Long id){
        return studentRepository.findById(id);
    }
}


5、运行验证

接下来,启动项目,验证jdbcTemplate 数据操作是否成功。访问地址: http://localhost:8080/student/findById/3, 查询学生信息。

image.png

我们看到,后台成功返回了该学生的相关信息,接下来,我们在Druid中查看SQL的执行情况。通过http://localhost:8080/druid 进入监控后台,查看SQL的执行情况,具体如下图所示:

image.png

如上图所示,Druid的 SQL 监控会将项目中执行的所有SQL 打印出来,展示 SQL执行了多少次、每次返回多少数据、执行的时间分布是什么。这些功能非常的实用,方便我们在实际生产中查找出慢 SQL,最后对 SQL 进行调优。


最后

以上,我们介绍了如何在Spring Boot 中集成Druid 实现数据库连接和监控的功能。然后通过Druid + jdbcTemplate 实现完整的数据操作。






相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
10天前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
52 3
|
2天前
|
druid Java Maven
|
10天前
|
SQL 数据库 数据安全/隐私保护
SQL附加数据库出错的原因与解决方案3w9.0575cst.com
随着信息技术的不断发展,数据库已经成为了各行各业不可或缺的重要组成部分。而SQL作为最流行的数据库管理系统之一,其应用也越来越广泛。但在实际使用中,由于各种原因,我们可能会遇到SQL附加数据库出错的情况。本文将详细介绍SQL附加数据库出错的原因,以及相应的解决方案。一、SQL附加数据库出错的原因1.
|
9天前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
24 1
|
9天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
14 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
9天前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
11 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
6天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
19 0
|
9天前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
41 0
|
10天前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析
|
9天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
43 6