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

}

 

posted @ 2022-02-24 09:39  星辰°  阅读(3200)  评论(0编辑  收藏  举报