使用Hutool-db連接數據庫的SpringBoot項目添加Druid連接池


  HuTool工具的Hutool-db支持幾種常用的數據庫連接池:HikariCP、Druid、Tomcat JDBC Pool、C3P0、DBCP。Hutool-db沒有引入這幾種常用連接池的依賴,如果用戶不引入,HuTool就會使用內置的連接池Hutool Pooled。這個連接池很簡單不適合線上項目使用。

  因為之前只用過Druid連接池,所以這里就用Druid連接池了。

添加Maven依賴

<!-- HuTool工具 -->
<dependency>
   <groupId>cn.hutool</groupId>
   <artifactId>hutool-all</artifactId>
    <version>5.7.11</version>
</dependency> <!-- MySQL連接驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Druid連接池 --> <dependency>
<groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>

配置文件

  HuTool連接數據庫以及連接池的配置不在application.properties文件內,而是在和它同級的db.setting文件內,這個setting文件需要自己創建。

## db.setting文件

url = jdbc:mysql://IP:端口/數據庫?serverTimezone=GMT%2B8
user = 用戶名
pass = 密碼


## 可選配置
# 是否在日志中顯示執行的SQL
showSql = true
# 是否格式化顯示的SQL
formatSql = false
# 是否顯示SQL參數
showParams = true
# 打印SQL的日志等級,默認debug,可以是info、warn、error
sqlLevel = debug


# 初始化時建立物理連接的個數。初始化發生在顯示調用init方法,或者第一次getConnection時
initialSize = 0
# 最大連接池數量
maxActive = 8
# 最小連接池數量
minIdle = 0
# 獲取連接時最大等待時間,單位毫秒。配置了maxWait之后, 缺省啟用公平鎖,並發效率會有所下降, 如果需要可以通過配置useUnfairLock屬性為true使用非公平鎖。
maxWait = 0
# 是否緩存preparedStatement,也就是PSCache。 PSCache對支持游標的數據庫性能提升巨大,比如說oracle。 在mysql5.5以下的版本中沒有PSCache功能,建議關閉掉。作者在5.5版本中使用PSCache,通過監控界面發現PSCache有緩存命中率記錄, 該應該是支持PSCache。
poolPreparedStatements = false
# 要啟用PSCache,必須配置大於0,當大於0時, poolPreparedStatements自動觸發修改為true。 在Druid中,不會存在Oracle下PSCache占用內存過多的問題, 可以把這個數值配置大一些,比如說100
maxOpenPreparedStatements = -1
# 用來檢測連接是否有效的sql,要求是一個查詢語句。 如果validationQuery為null,testOnBorrow、testOnReturn、 testWhileIdle都不會其作用。
validationQuery = SELECT 1
# 申請連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能。
testOnBorrow = false
# 歸還連接時執行validationQuery檢測連接是否有效,做了這個配置會降低性能
testOnReturn = false
# 建議配置為true,不影響性能,並且保證安全性。 申請連接的時候檢測,如果空閑時間大於 timeBetweenEvictionRunsMillis,執行validationQuery檢測連接是否有效。
testWhileIdle = true
# 有兩個含義: 1) Destroy線程會檢測連接的間隔時間 2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明
timeBetweenEvictionRunsMillis = 60000
# 物理連接初始化的時候執行的sql
connectionInitSqls = SELECT 1
# 屬性類型是字符串,通過別名的方式配置擴展插件,常用的插件有: 監控統計用的filter:stat  日志用的filter:log4j 防御sql注入的filter:wall
filters = stat
# 類型是List<com.alibaba.druid.filter.Filter>, 如果同時配置了filters和proxyFilters, 是組合關系,並非替換關系
proxyFilters =

開啟Druid監控頁面

  HuTool添加Druid連接池后發現無法通過配置文件開啟監控頁面,所以需要通過@Bean注解來開啟監控頁面。

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.druid.support.http.StatViewServlet;

import java.util.HashMap;
import java.util.Map;

// 開啟Druid監控頁面
// HuTool使用Druid連接池應該是沒有監控頁面的配置(因為在HuTool官方文檔內沒找到)
// 所以通過@Bean注解注冊一個Servlet來開啟Druid監控頁面
@Configuration
public class DruidMonitor {

    // @Bean注解的方法不能和類名相同,類自動裝配創建的實例默認首字母小寫,會和方法名沖突
    // 比如類名為DruidMonitor,方法名為druidMonitor會報如下錯:
    // The bean 'druidMonitor', defined in class path resource
    // [com/star/test/conf/DruidMonitor.class], could not be registered.
    // A bean with that name has already been defined in file
    // [C:\Code\test\target\classes\com\star\test\conf\DruidMonitor.class]
    // and overriding is disabled.
    @Bean
    public ServletRegistrationBean<StatViewServlet> druidMonitorServlet(){
        ServletRegistrationBean<StatViewServlet> servletServletRegistrationBean = new ServletRegistrationBean<>();
        servletServletRegistrationBean.setServlet(new StatViewServlet());
        servletServletRegistrationBean.addUrlMappings("/druid/*");
        Map<String, String> initParameters = new HashMap<>();
        //禁用HTML頁面上的“Rest All”功能,使監控頁面重置按鈕失效,不會使重置按鈕消失。
        initParameters.put("resetEnable", "false");
        //ip白名單(沒有配置或者為空,則允許所有訪問),多個IP用逗號分隔
        initParameters.put("allow", "127.0.0.1");
//        //監控頁面登錄用戶名
//        initParameters.put("loginUsername", "admin");
//        //監控頁面登錄用戶密碼
//        initParameters.put("loginPassword", "123.admin");
        //ip黑名單,如果某個ip同時存在,deny優先於allow
//        initParameters.put("deny", "");
        servletServletRegistrationBean.setInitParameters(initParameters);
        return servletServletRegistrationBean;
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM