SpringBoot整合Druid实现数据库连接池和监控

网友投稿 1366 2022-12-14

SpringBoot整合Druid实现数据库连接池和监控

SpringBoot整合Druid实现数据库连接池和监控

目录1、Druid的简介2、创建SpringBoot项目与数据表2.1 创建项目2.2 创建数据表3、Druid实现数据库连接池3.1 Druid的配置3.2 创建实体类(Entity层)3.3 数据库映射层(Mapper层)3.4 业务逻辑层(Service层)3.5 控制器方法(Controller层)3.6 显示页面(View层)4、Druid实现监控功能

1、Druid的简介

Druid是java语言中使用的比较多的数据库连接池。Druid还提供了强大的监控和扩展功能。下面将介绍SpringBoot整合Druid实现数据库连接池和监控功能。

官方文档:《Druid官方文档》

2、创建SpringBoot项目与数据表

【实例】SpringBoot整合Druid实现数据库连接池和监控,使用MyBaits操作数据库,获取用户信息,如下图:

2.1 创建项目

(1)创建SpringBoot项目,项目结构如下图:

(2)使用Maven添加依赖文件

在pom.xml配置信息文件中,添加Druid连接池、MyBatis、mysql数据库、Thymeleaf模板引擎等相关依赖:

com.alibaba

druid-spring-boot-starter

1.1.23

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.3

mysql

mysql-connector-java

8.0.20

org.springframework.boot

spring-boot-starter-thymeleaf

2.2 创建数据表

使用MySQL数据库,创建 tb_user 用户信息表,并添加数据。

-- 判断数据表是否存在,存在则删除

DROP TABLE IF EXISTS tb_user;

-- 创建“用户信息”数据表

CREATE TABLE IF NOT EXISTS tb_user

(

user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号',

user_name VARCHAR(50) NOT NULL COMMENT '用户姓名',

age INT DEFAULT(0) NOT NULL COMMENT '年龄',

blog_url VARCHAR(50) NOT NULL COMMENT '博客地址',

blog_remark VARCHAR(50) COMMENT '博客信息'

) COMMENT = '用户信息表';

-- 添加数据

INSERT INTO tb_user(user_name,age,blog_url,blog_remark) VALUES('pan_junbiao的博客',32,'https://blog.csdn-/pan_junbiao','您好,欢迎访问 pan_junbiao的博客');

3、Druid实现数据库连接池

3.1 Druid的配置

在 application.yml 配置文件中配置Druid数据库连接池和监控、MyBatis配置。

#Spring配置

spring:

#使用Thymeleaf模板引擎

thymeleaf:

mode: HTML5

encoding: UTF-8

cache: false #使用Thymeleaf模板引擎,关闭缓存

servlet:

content-type: text/html

#JDBC配置

datasource:

url: jdbc:mysql://localhost:3306/db_admin?useSSL=false&amp

username: root

password: 123456

driver-class-name: com.mysql.cj.jdbc.Driver

type: com.alibaba.druid.pool.DruidDataSource

#Druid连接池配置

druid:

initial-size: 5 #初始化时建立物理连接的个数

max-active: 30 #最大连接池数量

min-idle: 5 # 最小连接池数量

druid.max-wait: 60000 #获取连接时最大等待时间,单位毫秒

time-between-eviction-runs-millis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

min-evictable-idle-time-millis: 300000 #连接保持空闲而不被驱逐的最小时间

validation-query: select 'x' #用来检测连接是否有效的sql 必须是一个查询语句:mysql中为 select 'x' oracle中为 select 1 from dual

test-while-idle: true #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

test-on-borrow: false #申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true

test-on-return: false #归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true

pool-prepared-statements: true #是否缓存preparedStatement,mysql5.5+建议开启

max-pool-prepared-statement-per-connection-size: 50 #要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。

filters: stat,wall #配置监控统计拦截的filters,去掉后监控界面sql无法统计

connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500 #通过connectProperties属性来打开mergeSql功能;慢SQL记录

use-global-data-source-stat: true #合并多个DruidDataSource的监控数据

#StatViewServlet配置

stat-view-servlet.enabled: true #是否启用StatViewServlet(监控页面)默认值为false

stat-view-servlet.login-username: admin #设置访问druid监控页的账号,默认没有

stat-view-servlet.login-password: admin #设置访问druid监控页的密码,默认没有

#MyBatis配置

mybatis:

type-aliases-package: com.pjb.entity #别名定义

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #指定 MyBatis 所用日志的具体实现,未指定时将自动查找

map-underscore-to-camel-case: true #开启自动驼峰命名规则(camel case)映射

lazy-loading-enabled: true #开启延时加载开关

aggressive-lazy-loading: false #将积极加载改为消极加载(即按需加载),默认值就是false

#lazy-load-trigger-methods: "" #阻挡不相干的操作触发,实现懒加载

cache-enabled: true #打开全局缓存开关(二级环境),默认值就是true

注意:druid的配置节点是在datasource节点之下的,节点的层级关系不要写错了。

3.2 创建实体类(Entity层)

在com.pjb.entity包中,创建UserInfo类(用户信息实体类)。

package com.pjb.entity;

import java.io.Serializable;

/**

* 用户信息实体类

* @author pan_junbiao

**/

public class UserInfo

{

private int userId; //用户编号

private String userName; //用户姓名

private int age; //年龄

private String blogUrl; //博客地址

private String blogRemark; //博客信息

//省略getter与setter方法...

}

3.3 数据库映射层(Mapper层)

在com.pjb.mapper包中,创建UserMapper接口(用户信息Mapper动态代理接口)。

package com.pjb.service;

import com.pjb.entity.UserInfo;

/**

* 用户信息业务逻辑接口

* @author pan_junbiao

**/

public interface UserService

{

/**

* 根据用户ID,获取用户信息

*/

public UserInfo getUserById(int userId);

/**

* 新增用户,并获取自增主键

*/

public UserInfo insertUser(UserInfo userInfo);

/**

* 修改用户

*/

public UserInfo updateUser(UserInfo userInfo);

/**

* 删除用户

*/

public int deleteUser(int userId);

}

3.4 业务逻辑层(Service层)

在com.pjb.service包下,创建UserService接口(用户信息业务逻辑接口)。

package com.pjb.service;

import com.pjb.entity.UserInfo;

/**

* 用户信息业务逻辑接口

* @author pan_junbiao

**/

public interface UserService

{

/**

* 根据用户ID,获取用户信息

*/

public UserInfo getUserById(int userId);

/**

* 新增用户,并获取自增主键

*/

public UserInfo insertUser(UserInfo userInfo);

/**

* 修改用户

*/

public UserInfo updateUser(UserInfo userInfo);

/**

* 删除用户

*/

public int deleteUser(int userId);

}

在com.pjb.service.impl包下,创建UserServiceImpl类(用户信息业务逻辑类)。

package com.pjb.service.impl;

import com.pjb.entity.UserInfo;

import com.pjb.mapper.UserMapper;

import com.pjb.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**

* 用户信息业务逻辑类

* @author pan_junbiao

**/

@Service

@Transactional

public class UserServiceImpl implements UserService

{

@Autowired

private UserMapper userMapper;

/**

* 根据用户ID,获取用户信息

*/

@Override

public UserInfo getUserById(int userId)

{

return userMapper.getUserById(userId);

}

/**

* 新增用户,并获取自增主键

*/

@Override

public UserInfo insertUser(UserInfo userInfo)

{

userMapper.insertUser(userInfo);

return userInfo;

}

/**

* 修改用户

*/

@Override

public UserInfo updateUser(UserInfo userInfo)

{

userMapper.updateUser(userInfo);

return userInfo;

}

/**

* 删除用户

*/

@Override

public int deleteUser(int userId)

{

return userMapper.deleteUser(userId);

}

}

在Service类上加上@Transactional事务注解,否则将会在控制台打印以下信息:

3.5 控制器方法(Controller层)

在com.pjb.controller包中,创建UserController类(用户控制器),实现用户数据的查询、新增、修改、删除,并实现数据的返回。

package com.pjb.controller;

import com.pjb.entity.UserInfo;

import com.pjb.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.servlet.ModelAndView;

/**

* 用户信息控制器

* @author pan_junbiao

**/

@Controller

@RequestMapping("/user")

public class UserController

{

@Autowired

private UserService userService;

/**

* 获取用户信息

*/

@RequestMapping("getUserById")

public ModelAndView getUserById(int userId)

{

//根据用户ID,获取用户信息

UserInfo userInfo = userService.getUserById(userId);

if(userInfo==null)

{

userInfo = new UserInfo();

}

NdZQEL //返回结果

ModelAndView modelAndView = new ModelAndView();

modelAndView.addObject("userInfo",userInfo);

modelAndView.setViewName("/user-info.html");

return modelAndView;

}

/**

* 新增用户

*/

@ResponseBody

@RequestMapping("insertUser")

public boolean insertUser()

{

//创建新用户

UserInfo userInfo = new UserInfo();

userInfo.setUserName("pan_junbiao的博客");

userInfo.setAge(32);

userInfo.setBlogUrl("https://blog.csdn-/pan_junbiao");

userInfo.setBlogRemark("您好,欢迎访问 pan_junbiao的博客");

//执行新增方法

userService.insertUser(userInfo);

//返回结果

return userInfo.getUserId() > 0 ? true : false;

}

/**

* 修改用户

*/

@ResponseBody

@RequestMapping("updateUser")

public boolean updateUser(int userId)

{

UserInfo userInfo = new UserInfo();

userInfo.setUserId(userId);

userInfo.setUserName("pan_junbiao的博客_02");

userInfo.setAge(35);

userInfo.setBlogUrl("https://blog.csdn-/pan_junbiao");

userInfo.setBlogRemark("您好,欢迎访问 pan_junbiao的博客");

//执行修改方法

userService.updateUser(userInfo);

//返回结果

return true;

}

/**

* 删除用户

*/

@ResponseBody

@RequestMapping("deleteUser")

public boolean deleteUser(int userId)

{

//执行新增方法

int result = userService.deleteUser(userId);

//返回结果

return result > 0 ? true : false;

}

}

3.6 显示页面(View层)

在 resources/templates 目录下,创建 user-info.html 用户信息显示页面。

执行结果:

(1)使用Druid数据库连接池从数据表中,获取用户信息,如下图:

(2)控制台输出的信息,如下图:

4、Druid实现监控功能

Druid实现监控功能,主要是在配置中,包括配置是否启动监控页面、设置访问监控页面的登录账号、密码等。如下图:

配置完成后,启动项目,在浏览器中直接输入如下地址:

http://127.0.0.1:8080/druid/login.html

http://127.0.0.1:8080/druid/index.html

登录页面:

Druid监控首页:

源代码-:https://github.com/kevinpanjunbiao/DruidDemo

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:基于Spring的注解@Qualifier小结
下一篇:完美解决Logback configuration error detected的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~