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 实现完整的数据操作。






相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
26 8
|
21天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
59 11
|
1月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
1月前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
1月前
|
XML Java API
Spring Boot集成MinIO
本文介绍了如何在Spring Boot项目中集成MinIO,一个高性能的分布式对象存储服务。主要步骤包括:引入MinIO依赖、配置MinIO属性、创建MinIO配置类和服务类、使用服务类实现文件上传和下载功能,以及运行应用进行测试。通过这些步骤,可以轻松地在项目中使用MinIO的对象存储功能。
|
2月前
|
消息中间件 Java Kafka
什么是Apache Kafka?如何将其与Spring Boot集成?
什么是Apache Kafka?如何将其与Spring Boot集成?
76 5
|
2月前
|
Java 关系型数据库 数据库连接
使用 Spring Boot 执行数据库操作:全面指南
使用 Spring Boot 执行数据库操作:全面指南
165 1
|
2月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
3月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 实现动态路由和菜单功能,快速搭建前后端分离的应用框架。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,包括版本兼容性、安全性、性能调优等方面。
208 1
|
2月前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个具有动态路由和菜单功能的前后端分离应用。首先,创建并配置 Spring Boot 项目,实现后端 API;然后,使用 Ant Design Pro Vue 创建前端项目,配置动态路由和菜单。通过具体案例,展示了如何快速搭建高效、易维护的项目框架。
135 62
下一篇
开通oss服务