SpringBoot整合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模板引擎等相關依賴:

<!-- 引入Druid連接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>
 
<!-- MyBatis與SpringBoot整合依賴 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.3</version>
</dependency>
 
<!-- MySQL的JDBC數據庫驅動 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.20</version>
</dependency>
 
<!-- 引入Thymeleaf模板引擎 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

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.net/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();
        }
 
        //返回結果
        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.net/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.net/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 用戶信息顯示頁面。

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用戶信息</title>
    <meta name="author" content="pan_junbiao的博客">
    <style>
        table { border-collapse: collapse; margin-bottom: 10px}
        table,table tr th, table tr td { border:1px solid #000000; padding: 5px 10px;}
    </style>
</head>
<body>
<div align="center">
    <table>
        <caption>用戶信息</caption>
        <tr>
            <th>用戶ID:</th>
            <td th:text="${userInfo.userId}"></td>
        </tr>
        <tr>
            <th>用戶名稱:</th>
            <td th:text="${userInfo.userName}"></td>
        </tr>
        <tr>
            <th>年齡:</th>
            <td th:text="${userInfo.age}"></td>
        </tr>
        <tr>
            <th>博客地址:</th>
            <td th:text="${userInfo.blogUrl}"></td>
        </tr>
        <tr>
            <th>備註信息:</th>
            <td th:text="${userInfo.blogRemark}"></td>
        </tr>
    </table>
</div>
</body>
</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

到此這篇關於SpringBoot整合Druid實現數據庫連接池和監控的文章就介紹到這瞭,更多相關SpringBoot Druid數據庫連接池和監控內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: