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