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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 我们知道,应用系统最频繁,最主要的操作还是数据库的操作,所以数据库的性能和安全对于整个系统平台的重要性不言而喻。为了提高数据库性能,我们可以使用数据库连接池,有时候我们需要增加一些列的日志或是数据库性能监控工具来确保数据库的性能,同时还得防范数据库的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
相关文章
|
23天前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
32 3
SpringBoot入门 - 添加内存数据库H2
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
49 4
SpringBoot入门(4) - 添加内存数据库H2
|
9天前
|
监控 jenkins Linux
从 Jenkins 持续集成出发:探究如何监控员工电脑屏幕
Jenkins 在企业信息化管理中用于自动化构建、测试和部署,提高开发效率。本文讨论了其重要性,并从技术角度探讨了屏幕监控的可能性,但明确反对非法监控,强调应合法合规地管理企业和尊重员工隐私。
49 12
|
19天前
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
63 1
|
23天前
|
SQL 自然语言处理 数据库
XiYan-SQL:一种多生成器集成的Text-to-SQL框架
XiYan-SQL 是一种创新的多生成器集成Text-to-SQL框架,通过M-Schema增强模型对数据库结构的理解,结合ICL与SFT方法提升SQL生成质量和多样性,经实验证明在多个数据集上表现优异,特别是在Spider和SQL-Eval上取得了领先成绩。
|
22天前
|
存储 Prometheus 运维
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案
在云原生环境中,阿里云ARMS与Prometheus的集成提供了强大的应用实时监控解决方案。该集成结合了ARMS的基础设施监控能力和Prometheus的灵活配置及社区支持,实现了全面、精准的系统状态、性能和错误监控,提升了应用的稳定性和管理效率。通过统一的数据视图和高级查询功能,帮助企业有效应对云原生挑战,促进业务的持续发展。
30 3
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
66 13
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
44 4
|
1月前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
20 0
|
2月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用