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; } }