当前位置: 首页 > news >正文

Java数据库连接池原理及spring boot使用数据库连接池(HikariCP、Druid)

和线程池类似,数据库连接池的作用是建立一些和数据库的连接供需要连接数据库的业务使用,避免了每次和数据库建立、销毁连接的性能消耗,通过设置连接池参数可以防止建立连接过多导致服务宕机等,以下介绍Java中主要使用的几种数据库连接池。

数据库连接池原理

首先业务程序操作数据库时,需要获取一个数据库的连接这就需要经过tcp的三次握手,建立连接后经过ssl等验证,然后执行sql语句返回数据,最终关闭连接执行四次挥手;整个过程而言如果没有慢sql的情况;tcp的三次握手四次挥手等占用时间反而比执行sql业务的时间更长,因此每次都建立连接将会消耗很多无用的时间,并且频繁建立导致系统不稳定,如果不加限制随意建立连接还可能导致服务宕机;所以此时可以通过连接池的思想(类似的还有线程池、常量池等)将创建的数据库连接维持在连接池中,重复使用该连接,并且设置连接池的参数避免创建连接过多导致服务宕机等。
配置好数据库连接池信息后,在项目启动时会去创建最小连接数数量的连接并放在连接池中,当业务需要数据库连接时,首先在连接池中查找是否有空闲的连接,如果有直接给业务使用,否则判断是否达到最大连接数,没有则创建新的连接给业务使用,如果已经达到则进入等待队列,等待连接池中有空闲连接时使用该连接,否则达到获取连接的超时时间抛出异常;同时空闲的连接在等待空闲超时时间后进行断开连接销毁连接,直到连接池中剩余连接数是最小连接数。

常用主流数据库连接池

比较老牌的数据库连接池,如C3P0等因为性能差,功能不齐全等原因在2019年之后作者就放弃了维护,因为出现了更加优秀的数据库连接池,所以这里就不作介绍,主要介绍目前最常用的两种数据库连接池;HikariCP和Druid连接池。
maven导入jar包查询jar包坐标信息
需要导入的共同的jar包(数据库连接驱动):

        <!-- mysql数据库连接驱动,采用Java自带的spi机制实现,Java提供相关接口标准,每个数据库厂商提供自己的数据库驱动实现,spring boot指定了版本,所以这里可以不写版本 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>

一、HikariCP

HiKariCP 是数据库连接池的一个后起之秀,号称性能最好,可以完美的 PK 掉其他连接池;是一个高性能的 JDBC连接池,基于 BoneCP 做了不少的改进和优化;spring boot 2.x 版本后默认使用的数据库连接池,也就是spring boot2.x之后只需要导入hikariCP的jar包就默认使用HikariCP连接池了,可以直接配置相关参数调整hikari数据库连接池参数即可;只需要加入数据库连接驱动jar包、mybatis等ORM框架就可连接操作数据库并使用连接池管理数据库连接。主要特点是性能非常高,为了达到这个目的主要做了两个优化:
1、常规数据库连接池都是将Statement存放在ArrayList中,而HikariCP自定义了FastList来替代ArrayList,主要对ArrayList的get()和remove()方法做了优化,这个List的主要作用是保证连接关闭时可以依次将数组中的所有Statement关闭;第一:取消ArrayList的get()方法的rangeCheck操作(检查索引是否越界)因为数据库连接池管理的List满足索引的合法性,能保证不会越界;第二:将ArrayList的remove()方法的从头开始遍历数组改为从尾部开始遍历数组(因为一般来说关闭List中保存的 Statement都是逆序关闭的,如果改为逆序遍历那么每次关闭只需要遍历第一个元素即可,提升了效率)这种优化只是基于特定场景的优化,相对来说ArrayList的使用范围更广,比如rangeCheck可以快速抛出异常,逆序遍历也只是场景会逆序遍历,大多数情况获取元素是随机的。
2、使用ConcurrentBag优化阻塞队列,目前主流数据库连接池实现方式,基本都是用两个阻塞队列来实现。一个用于保存空闲数据库连接的队列 idle,一个用于保存忙碌数据库连接的队列 busy;当获取连接时会返回一个空闲连接并将这个空闲连接从 idle 队列移动到 busy 队列,而业务释放连接时将数据库连接从 busy 移动到 idle。这种方式将并发问题交给了阻塞队列处理,实现简单,但 jdk 中的阻塞队列是用Lock机制实现的,在高并发场景下锁的竞争对性能影响很大,所以性能会有所下降;因此HikariCP创建了ConcurrentBag来替代阻塞队列。ConcurrentBag主要实现流程:
四个变量:
a、存储所有的数据库连接的共享队列 sharedList(CopyOnWriteArrayList类型)
b、线程本地存储 threadList(该变量是ThreadLocal类型,避免了线程竞争,主要作用是保存某个线程获取的数据库连接信息,这样当前线程重复获取数据库连接时,如果在threadList中存在,说明以前获取过数据库连接,那么直接将这个对应的数据库连接返回给客户端使用)
c、等待数据库连接的线程数 waiters(AtomicInteger类型)
d、分配数据库连接的工具 handoffQueue(SynchronousQueue类型,这个变量是核心,负责分配数据库连接操作)
所有创建的连接都会通过add()方法添加到sharedList中。
当有客户端获取连接时通过handoffQueue进行分配连接给客户端,首先判断threadList中是否存在对应线程空闲连接,如果有,则返回一个空闲的连接;没有则去sharedList中查找一个空闲连接返回给客户端(CAS操作获取连接,因为该变量是多个线程共享),如果也没有则将请求线程进行等待;当客户端使用完数据库连接之后进行释放时,首先将数据库连接改为空闲状态,然后查看是否有等待线程,如果有等待线程则将该连接分配给等待线程,如果没有等待线程将该数据库连接保存在threadList中。

优化点总结:
1、字节码精简 :优化代码,编译后的字节码量极少,使得CPU缓存可以加载更多的程序代码;
2、优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
3、自定义集合类型(FastStatementList)代替ArrayList:避免ArrayList每次get()都要进行range check,避免调用remove()时的从头到尾的扫描(由于连接的特点是后获取连接的先释放);
4、自定义集合类型(ConcurrentBag):提高并发读写的效率;
5、其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究。

导入hikari的jar包:

<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>3.4.5</version>
</dependency>

由于spring boot 2.x版本后默认使用hikariCP,此时配置好数据库连接参数,操作数据库时就已经使用了Hikari连接池,但一般操作数据库时还需要导入ORM框架,这里以mybatis-plus为例,当我们导入mybatis-plus的starter或mybatis的starter之后,都会导入 spring-boot-starter-jdbc jar包而 spring-boot-starter-jdbc jar包里面又会导入 HikariCP jar包,所以项目使用 mybatis-plus 作为ORM框架之后,如果导入对应的starter那么此时不需要再导入 HikariCP jar包,直接做 HikariCP 的相关配置即可(如果采用spring-boot-starter-data-jpa作为ORM框架也会导入spring-boot-starter-jdbc jar包)。

mybatis-plus的starter
在这里插入图片描述
mybatis的starter
在这里插入图片描述
导入mybatis-plus框架:

        <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version></dependency>

配置hikariCP参数:

server:port: 9001  #服务端口号
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driver   #数据库连接驱动,如果是5.7以上版本的mysql数据库驱动就需要cj,5.7以下版本的mysql数据库驱动不要写cjurl: jdbc:mysql://127.0.0.1:3306/test?setUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true  #数据库地址username: root  #数据库登录账号password: root   #数据库登录密码type: com.zaxxer.hikari.HikariDataSource   #默认值就是com.zaxxer.hikari.HikariDataSource,所以该配置可以省略hikari: #以下为hikaricp相关配置auto-commit: true #是否自动提交池中返回的连接,默认值为true,一般是有必要自动提交上一个连接中的事物的,如果为false,那么就需要应用层手动提交事物minimum-idle: 30  #连接池中允许的最小连接数,默认值:10maximum-pool-size: 30  #连接池中允许的最大连接数,默认值:10,建议最大最小连接数指定一样,这样就可以维持连接池中固定的连接,避免连接池中有时连接数过少的情况idle-timeout: 30000  #一个连接空闲状态的最大时长(毫秒),超时则被释放(retired),默认值:10分钟pool-name: testHikari  #连接池名称max-lifetime: 1800000  #一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),默认值:30分钟,建议设置比数据库超时时长少30秒,数据库断开空闲连接的超时时长默认8小时connection-timeout: 30000  #等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 默认值:30秒connection-test-query: SELECT 1  #数据库连接测试语句, ping的形式更高效,ping的形式验证连接只能通过超时进行验证,也就是需要在url(spring.datasource.url)中指定参数 socketTimeout=250 ,并将该配置注释validation-timeout: 5000  #数据库连接被测试存活的最长时间(毫秒),默认值:5秒#mybatis-plus相关配置
mybatis-plus:mapper-locations: classpath:/mapper/*.xml   #指定xml文件所在目录global-config:db-config:id-type: auto  #主键默认数据库自动生成logic-delete-value: 1  #逻辑删除字段,1表示逻辑删除logic-not-delete-value: 0  #逻辑删除字段,0表示未删除

此时整合好数据库连接及连接池配置,编写代码测试:
entity:

package com.database.pool.testpool.entity;import com.baomidou.mybatisplus.annotation.*;@TableName("test_idcard")
public class TestIdcardEntity {/*** 主键*/@TableId(type= IdType.AUTO)private String id;/*** 姓名*/private String name;/*** 身份证号*/private String idcard;/*** 联系电话*/private String phone;/*** 备注*/private String remark;/*** 数字*/private boolean number;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getIdcard() {return idcard;}public void setIdcard(String idcard) {this.idcard = idcard;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getRemark() {return remark;}public void setRemark(String remark) {this.remark = remark;}public boolean getNumber() {return number;}public void setNumber(boolean number) {this.number = number;}@Overridepublic String toString() {return "TestIdcardEntity{" +"idNumber=" + id +", name='" + name + '\'' +", idcard='" + idcard + '\'' +", phone='" + phone + '\'' +", remark='" + remark + '\'' +'}';}
}

dao:

package com.database.pool.testpool.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.database.pool.testpool.entity.TestIdcardEntity;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface TestIdcardDao extends BaseMapper<TestIdcardEntity> {
}

service:

package com.database.pool.testpool.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.database.pool.testpool.entity.TestIdcardEntity;public interface TestIdcardService extends IService<TestIdcardEntity> {
}

serviceImpl:

package com.database.pool.testpool.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.database.pool.testpool.dao.TestIdcardDao;
import com.database.pool.testpool.entity.TestIdcardEntity;
import com.database.pool.testpool.service.TestIdcardService;
import org.springframework.stereotype.Service;@Service
public class TestIdcardServiceImpl extends ServiceImpl<TestIdcardDao, TestIdcardEntity> implements TestIdcardService {
}

controller:

package com.database.pool.testpool.controller;import com.database.pool.testpool.entity.TestIdcardEntity;
import com.database.pool.testpool.service.TestIdcardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/test")
@RestController
public class TestController {@Autowiredprivate TestIdcardService testIdcardService;/*** 测试身份证表详情查询*/@GetMapping("/info/{id}")public TestIdcardEntity info(@PathVariable("id") Integer id){TestIdcardEntity testIdcard = testIdcardService.getById(id);return testIdcard;}}

测试接口:
在这里插入图片描述

二、Druid

在实际项目中,企业使用最多的数据库连接池就是 Druid,是目前国内使用范围最广的数据源产品,Druid 是阿里巴巴推出的一款开源的高性能数据源产品,Druid 支持所有JDBC 兼容的数据库,包括 Oracle、MySQL、SQL Server 和 H2等等;性能上低于HikariCP但提供有非常完善的管理监控功能及可视化界面,并且历经高并发的检验。

主要包括三部分:
a、DruidDriver 代理Driver,能够提供基于Filter-Chain横式的插件体系
b、DruidDataSource 高效可管理的数据库连接池
c、SOLParser SQL解析器

Druid 不属于 Spring Boot 内部提供的技术,它属于第三方技术,可以通过以下两种方式进行整合:
a、自定义整合 Druid
b、通过 starter 整合 Druid(starter由阿里提供)

同样采用mybatis-plus作为ORM框架
mybatis-plus-boot-starter 会导入 HikariCP 的jar包,使用Druid时建议将 HikariCP 的jar包排除

        <!-- ORM框架,mybatis-plus的starter,用于Mapper层的操作 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version><!-- 排除 HikariCP jar包 --><exclusions><exclusion><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></exclusion></exclusions></dependency>

1、spring boot 自定义整合 Druid

导入jar包:

        <!-- druid连接池核心包,不是spring boot官方提供的组件一般没有定义默认版本,所以需要指定版本 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency>

配置文件设置:

server:port: 9001  #服务端口号
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driver   #数据库连接驱动,如果是5.7以上版本的mysql数据库驱动就需要cj,5.7以下版本的mysql数据库驱动不要写cjurl: jdbc:mysql://127.0.0.1:3306/test?setUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true  #数据库地址username: root  #数据库登录账号password: root   #数据库登录密码type: com.alibaba.druid.pool.DruidDataSource   #默认值是com.zaxxer.hikari.HikariDataSource#mybatis-plus相关配置
mybatis-plus:mapper-locations: classpath:/mapper/*.xml   #指定xml文件所在目录global-config:db-config:id-type: auto  #主键默认数据库自动生成logic-delete-value: 1  #逻辑删除字段,1表示逻辑删除logic-not-delete-value: 0  #逻辑删除字段,0表示未删除

创建druid配置类:

package com.database.pool.testpool.config;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;@Configuration
public class DruidConfig extends WebMvcAutoConfiguration {@Bean@ConfigurationProperties("spring.datasource")//设置DataSource采用 spring.datasource 的配置public DataSource createDataSource(){DruidDataSource dataSource = new DruidDataSource();return dataSource;}}

测试:
在这里插入图片描述
如果没有加入 DruidConfig 配置类,测试时报错如下:

在这里插入图片描述

2、spring boot starter 整合 Druid

不需要 DruidConfig 配置类
导入jar包:

        <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency>

由于 druid-spring-boot-starter 中已经依赖了 druid 所以可以将第一种方式spring boot 自定义整合 Druid中导入的 druid 包去除
在这里插入图片描述
导入日志相关包(由于配置监控时采用log4j2,所以需要相关日志包)

        <!-- spring boot web包starter,可以采用spring boot的方式编写controller层接口 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!--排除logging,排除所有的日志依赖--><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><!-- 添加log4j2 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>    <!--如果需要异步日志则导入异步日志依赖--><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.3.4</version></dependency>  <!-- 对lombok注解的支持 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>  

采用 spring boot starter 整合 Druid 总计导入包信息:

    <dependencies><!-- spring boot核心包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- spring boot web包starter,可以采用spring boot的方式编写controller层接口 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!--排除logging,排除所有的日志依赖--><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion></exclusions></dependency><!-- 添加log4j2 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><!--如果需要异步日志则导入异步日志依赖--><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.3.4</version></dependency><!-- mysql数据库连接驱动,采用Java自带的spi机制实现,Java提供相关接口标准,每个数据库厂商提供自己的数据库驱动实现 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.8</version></dependency><!-- ORM框架,mybatis-plus的starter,用于Mapper层的操作 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.2</version><!-- 排除 HikariCP jar包 --><exclusions><exclusion><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></exclusion></exclusions></dependency><!-- 对lombok注解的支持 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>

Druid连接池配置:

spring:datasource:druid:initial-size: 5   #初始化连接数量max-active: 20   #最大连接数量min-idle: 10   #最小连接数量max-wait: 5000   #毫秒,从连接池中获取连接等待超时时间name: testDruid   #连接池名称time-between-eviction-runs-millis: 5000   #间隔多久进行一次连接检测,检测需要关闭的空闲连接,毫秒min-evictable-idle-time-millis: 600000   #一个连接在连接池中最小空闲存在时间,毫秒max-evictable-idle-time-millis: 1200000   #一个连接在连接池中最长空闲存在时间,毫秒,建议设置为比8小时小,数据库默认连接空闲8小时进行断开连接validation-query: select 1   #检测连接是否可用的sql语句validation-query-timeout: 2000   #检测连接是否可用超时时间,毫秒test-on-borrow: false   #默认false,从连接池获取连接时是否检测连接是否可用test-on-return: false   #默认false,程序使用完连接连接池回收连接时,连接池是否判断连接是否可用test-while-idle: true   #默认true,从连接池获取连接时是否判断连接为空闲状态,如果是空闲连接即使test-on-borrow为false也会验证连接是否可用phy-max-use-count: 1000   #每个连接最多使用次数,避免长时间使用相同连接造成服务器端负载不均衡pool-prepared-statements: false   #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql建议关闭max-open-prepared-statements: 50   #如果开启PsCache,必须配置大于0,并且大于0时,pool-prepared-statements自动触发修改为true,在Druid中,不会存在oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,如100keep-alive: false   #连接池中连接数量在min-idle以内的连接,且空闲时间超过max-evictable-idle-time-millis之后,是否执行keep-alive操作,即连接池中连接数量小于最小连接数时,这些连接空闲时间超过配置的最长空闲存在时间是否依然保持连接不断开删除连接

Druid监控配置:
stat:Druid内置提供一个StatFilter,用于统计监控信息。
wall:Druid防御SQL注入攻击的WallFilter就是通过Druid的SQL Parser分析;Druid提供的SQL Parser可以在JDBC层拦截SQL做相应处理,比如说分库分表、审计等。
log4j2:日志记录的功能,可以把sql语句打印到 log4j2 供排查问题。

spring:datasource:druid:aop-patterns: "com.database.pool.testpool.dao.*"   #spring监控,利用 aop 机制对指定接口的执行时间,jdbc数进行记录filters: stat,wall,log4j2   #启用哪些内置过滤器 (stat 必须,否则监控不到SQL,wall用于防火墙,log4j2日志记录)即启用哪些监控统计拦截的filterfilter:   #配置监控信息stat:enabled: true   #开启 DruidDataSource 状态监控即sql监控,只有开启后相关filter的配置才会生效db-type: mysql   #数据库类型log-slow-sql: true   #开启慢sql监控slow-sql-millis: 2000   #慢sql阈值,单位毫秒,即超过2s的sql认为是慢sql进行记录日志slf4j:   #日志采用slf4j门面进行输出相关配置enabled: true  #开启slf4j日志记录,只有开启后相关filter的配置才会生效statement-log-error-enabled: true   #开启报错日志的记录statement-create-after-log-enabled: falsestatement-close-after-log-enabled: falseresult-set-open-after-log-enabled: falseresult-set-close-after-log-enabled: falseweb-stat-filter:enabled: true   #开启statFilter即开启web-jdbc关联监控数据,只有开启后相关filter的配置才会生效url-pattern: /*   #过滤所有url即所有url进行监控exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"   #排除不必要的url监控路径session-stat-enable: true   #开启session统计功能session-stat-max-count: 1000   #session的最大个数,默认100stat-view-servlet:enabled: true   #开启statViewServlet即开启内置监控界面,默认false,只有开启后相关filter的配置才会生效url-pattern: /druid/*   #访问内置监控页面的路径,内置监控页面首页是 当前服务的ip:端口/druid/index.htmlreset-enable: false   #不允许清空统计数据重新计算即不允许重置统计信息login-username: druid   #访问监控页面账号login-password: 123456   #访问监控页面密码allow: 127.0.0.1   #允许访问监控界面的地址,如果没有配置或为空,表示所有地址都允许访问,ip白名单deny: 192.168.0.1   #不允许访问监控界面的地址,如果allow和deny都存在的地址则优先deny生效,ip黑名单

连接池+监控+mybatis-plus总计配置:

server:port: 9001  #服务端口号
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driver   #数据库连接驱动,如果是5.7以上版本的mysql数据库驱动就需要cj,5.7以下版本的mysql数据库驱动不要写cjurl: jdbc:mysql://127.0.0.1:3306/test?setUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowMultiQueries=true&allowPublicKeyRetrieval=true  #数据库地址username: root  #数据库登录账号password: root   #数据库登录密码type: com.alibaba.druid.pool.DruidDataSource   #默认值是com.zaxxer.hikari.HikariDataSourcedruid:initial-size: 5   #初始化连接数量max-active: 20   #最大连接数量min-idle: 10   #最小连接数量max-wait: 5000   #毫秒,从连接池中获取连接等待超时时间name: testDruid   #连接池名称time-between-eviction-runs-millis: 5000   #间隔多久进行一次连接检测,检测需要关闭的空闲连接,毫秒min-evictable-idle-time-millis: 600000   #一个连接在连接池中最小空闲存在时间,毫秒max-evictable-idle-time-millis: 1200000   #一个连接在连接池中最长空闲存在时间,毫秒,建议设置为比8小时小,数据库默认连接空闲8小时进行断开连接validation-query: select 1   #检测连接是否可用的sql语句validation-query-timeout: 2000   #检测连接是否可用超时时间,毫秒test-on-borrow: false   #默认false,从连接池获取连接时是否检测连接是否可用test-on-return: false   #默认false,程序使用完连接连接池回收连接时,连接池是否判断连接是否可用test-while-idle: true   #默认true,从连接池获取连接时是否判断连接为空闲状态,如果是空闲连接即使test-on-borrow为false也会验证连接是否可用phy-max-use-count: 1000   #每个连接最多使用次数,避免长时间使用相同连接造成服务器端负载不均衡pool-prepared-statements: false   #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql建议关闭max-open-prepared-statements: 50   #如果开启PsCache,必须配置大于0,并且大于0时,pool-prepared-statements自动触发修改为true,在Druid中,不会存在oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,如100keep-alive: false   #连接池中连接数量在min-idle以内的连接,且空闲时间超过max-evictable-idle-time-millis之后,是否执行keep-alive操作,即连接池中连接数量小于最小连接数时,这些连接空闲时间超过配置的最长空闲存在时间是否依然保持连接不断开删除连接aop-patterns: "com.database.pool.testpool.dao.*"   #spring监控,利用 aop 机制对指定接口的执行时间,jdbc数进行记录filters: stat,wall,log4j2   #启用哪些内置过滤器 (stat 必须,否则监控不到SQL,wall用于防火墙,log4j2日志记录)即启用哪些监控统计拦截的filterfilter:   #配置监控信息stat:enabled: true   #开启 DruidDataSource 状态监控即sql监控,只有开启后相关filter的配置才会生效db-type: mysql   #数据库类型log-slow-sql: true   #开启慢sql监控slow-sql-millis: 2000   #慢sql阈值,单位毫秒,即超过2s的sql认为是慢sql进行记录日志slf4j:   #日志采用slf4j门面进行输出相关配置enabled: true  #开启slf4j日志记录,只有开启后相关filter的配置才会生效statement-log-error-enabled: true   #开启报错日志的记录statement-create-after-log-enabled: falsestatement-close-after-log-enabled: falseresult-set-open-after-log-enabled: falseresult-set-close-after-log-enabled: falseweb-stat-filter:enabled: true   #开启statFilter即开启web-jdbc关联监控数据,只有开启后相关filter的配置才会生效url-pattern: /*   #过滤所有url即所有url进行监控exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"   #排除不必要的url监控路径session-stat-enable: true   #开启session统计功能session-stat-max-count: 1000   #session的最大个数,默认100stat-view-servlet:enabled: true   #开启statViewServlet即开启内置监控界面,默认false,只有开启后相关filter的配置才会生效url-pattern: /druid/*   #访问内置监控页面的路径,内置监控页面首页是 当前服务的ip:端口/druid/index.htmlreset-enable: false   #不允许清空统计数据重新计算即不允许重置统计信息login-username: druid   #访问监控页面账号login-password: 123456   #访问监控页面密码allow: 127.0.0.1   #允许访问监控界面的地址,如果没有配置或为空,表示所有地址都允许访问,ip白名单deny: 192.168.0.1   #不允许访问监控界面的地址,如果allow和deny都存在的地址则优先deny生效,ip黑名单#mybatis-plus相关配置
mybatis-plus:mapper-locations: classpath:/mapper/*.xml   #指定xml文件所在目录global-config:db-config:id-type: auto  #主键默认数据库自动生成logic-delete-value: 1  #逻辑删除字段,1表示逻辑删除logic-not-delete-value: 0  #逻辑删除字段,0表示未删除

测试:
在这里插入图片描述
访问Druid监控界面(账号druid,密码123456):
在这里插入图片描述
在这里插入图片描述
idea创建spring boot项目整合mybatis-plus
Java日志框架JUL、Log4j、logback、log4j2使用

相关文章:

Java数据库连接池原理及spring boot使用数据库连接池(HikariCP、Druid)

和线程池类似&#xff0c;数据库连接池的作用是建立一些和数据库的连接供需要连接数据库的业务使用&#xff0c;避免了每次和数据库建立、销毁连接的性能消耗&#xff0c;通过设置连接池参数可以防止建立连接过多导致服务宕机等&#xff0c;以下介绍Java中主要使用的几种数据库…...

百度商业AI 技术创新大赛赛道二:AIGC推理性能优化TOP10之经验分享

朋友们&#xff0c;AIGC性能优化大赛已经结束了&#xff0c;看新闻很多队员已经完成了答辩和领奖环节&#xff0c;我根据内幕人了解到&#xff0c;比赛的最终代码及结果是不会分享出来的&#xff0c;因为办比赛的目的就是吸引最优秀的代码然后给公司节省自己开发的成本&#xf…...

微服务时代java异常捕捉

一、尽量不要使用e.printStackTrace(),而是使用log打印。 ​反例:​ try{ // do what you want }catch(Exception e){ e.printStackTrace(); } ​ 正例&#xff1a;​ try{ // do what you want }catch(Exception e){ log.info("你的程序有异常啦,{}",e)…...

Hadoop支持LZO压缩

LZO(Lempel-Ziv-Oberhumer)是一种快速压缩算法,特别适用于大数据处理。在Hadoop生态系统中,LZO压缩通常用于Hadoop MapReduce作业的输入和输出数据,以减少存储空间和数据传输的开销。 以下是在Hadoop中使用LZO压缩的一般步骤: 安装LZO库和工具: 首先,需要在Hadoop集群…...

vue3 01-setup函数

1.setup函数的作用: 1.是组合式api的入口2.比beforeCreate 执行更早3.没有this组件实例一开始创建vue3页面的时候是这样的 <template></template> <script> export default{setup(){return{ }} } </script>给容器传参在页面中显示 数据给模板使用,以…...

iOS swift 类似AirDrop的近场数据传输 MultipeerConnectivity 框架

文章目录 1.github上的demo 1.github上的demo insidegui/MultipeerDemo – github insidegui/MultipeerKit – github...

Lnton羚通云算力平台OpenCV-PythonCanny边缘检测教程

Canny 边缘检测是一种经典的边缘检测算法&#xff0c;由 John F. Canny 在 1986 年提出。它被广泛应用于计算机视觉和图像处理领域&#xff0c;用于检测图像中的边缘。 ​【原理】 1. 去噪 由于边缘检测非常容易收到图像的噪声影响&#xff0c;第一步使用 5x5 高斯滤波去除图…...

2023-8-23 滑动窗口

题目链接&#xff1a;滑动窗口 #include <iostream>using namespace std;const int N 1000010;int n, k; int a[N], q[N];int main() {scanf("%d%d", &n, &k);for(int i 0; i < n; i) scanf("%d", &a[i]);int hh 0, tt -1;for(…...

SOA通信中间件常用的通信协议

摘要&#xff1a; SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。 前言 SOA&#xff08;面向服务的架构&#xff09;的软件设计原则之一是模块化。模块化可以提高软件系统的可维护性和代码重用性&#xff0c;并且能够隔离故障。举例来说&#xff0c;…...

解决npm安装依赖失败,node和node-sass版本不匹配的问题

npm安装依赖报错&#xff1a; npm ERR! cb() never called! npm ERR! This is an error with npm itself. 一. 问题描述 用npm安装依赖报错&#xff1a; npm ERR! cb() never called! npm ERR! This is an error with npm itself. Please report this error at: npm ERR! …...

2023 网络建设与运维 X86架构计算机操作系统安装与管理题解

任务描述: 随着信息技术的快速发展,集团计划2023年把部分业务由原有的X86架构服务器上迁移到ARM架构服务器上,同时根据目前的部分业务需求进行了部分调整和优化。 一、X86架构计算机操作系统安装与管理 1.PC1系统为ubuntu-desktop-amd64系统(已安装,语言为英文),登录用户…...

LAMP 架构及Discuz论坛与Wordpress博客搭建

目录 1 LAMP 配置与应用 1.1动态资源与语言 1.2 LAMP 架构的组成 1.2.1 主要功能 2 编译安装Apache http 服务 2.1 环境准备 2.1.1 关闭防火墙及selinux服务 2.1.2 安装依赖环境 2.2 安装软件包 2.2.1 解压软件包 2.2.2 移动apr包 apr-util包到安装目录中&#xff0c;并…...

考研C语言进阶题库——更新51-60题

目录 51.银行系中有很多恒星&#xff0c;H 君晚上无聊&#xff0c;便爬上房顶数星星&#xff0c;H 君将整个银河系看做一个平面&#xff0c;左上角为原点&#xff08;坐标为&#xff08;1, 1&#xff09;&#xff09;。现在有 n 颗星星&#xff0c;他给每颗星星都标上坐标&…...

智能算法挑战赛决赛题目——初中组

题目 1. 判断是否存在重复的子序列 从 m 个字符中选取字符&#xff0c;生成 n 个符号的序列&#xff0c;使得其中没有 2 个相邻的子序列相同。如从 1&#xff0c;2&#xff0c;3&#xff0c;生成长度为 5 的序列&#xff0c;序列“12321”是合格的&#xff0c;而“12323”和“…...

一分钟学算法-递归-斐波那契数列递归解法及优化

一分钟学一个算法题目。 今天我们要学习的是用递归算法求解斐波那契数列。 首先我们要知道什么是斐波那契数列。 斐波那契数列&#xff0c;又称黄金分割数列&#xff0c;是一个经典的数学数列&#xff0c;其特点是第一项&#xff0c;第二项为1&#xff0c;后面每个数字都是前…...

选择Rust,并在Ubuntu上使用Rust

在过去的 8 年里&#xff0c;Rust 一直是开发人员最喜欢的语言&#xff0c;并且越来越被各种规模的软件公司采用。然而&#xff0c;它的许多高级规则和抽象创造了一个陡峭的初始学习曲线&#xff0c;这可能会给人留下 Rust 是少数人的保留的印象&#xff0c;但这与事实相去甚远…...

SVM详解

公式太多了&#xff0c;就用图片用笔记呈现&#xff0c;SVM虽然算法本质一目了然&#xff0c;但其中用到的数学推导还是挺多的&#xff0c;其中拉格朗日约束关于α>0这块证明我看了很长时间&#xff0c;到底是因为悟性不够。对偶问题也是&#xff0c;用了一个简单的例子才明…...

mysql全文检索使用

数据库数据量10万左右&#xff0c;使用like %test%要耗费30秒左右&#xff0c;放弃该办法 使用mysql的全文检索 第一步:建立索引 首先修改一下设置: my.ini中ngram_token_size 1 可以通过 show variables like %token%;来查看 接下来建立索引:alter table 表名 add f…...

opencv 进阶17-使用K最近邻和比率检验过滤匹配(图像匹配)

K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;和比率检验&#xff08;Ratio Test&#xff09;是在计算机视觉中用于特征匹配的常见技术。它们通常与特征描述子&#xff08;例如SIFT、SURF、ORB等&#xff09;一起使用&#xff0c;以在图像中找到相似…...

Mac Flutter web环境搭建

获取 Flutter SDK 下载以下安装包来获取最新的 stable Flutter SDK将文件解压到目标路径, 比如: cd ~/development $ unzip ~/Downloads/flutter_macos_3.13.0-stable.zip 配置 flutter 的 PATH 环境变量&#xff1a; export PATH"$PATH:pwd/flutter/bin" // 这个命…...

在外SSH远程连接macOS服务器

文章目录 前言1. macOS打开远程登录2. 局域网内测试ssh远程3. 公网ssh远程连接macOS3.1 macOS安装配置cpolar3.2 获取ssh隧道公网地址3.3 测试公网ssh远程连接macOS 4. 配置公网固定TCP地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址 5. 使用固定TCP端口地址ssh远程 …...

Dockerfile文件详细

Dockerfile 是一个文本文件&#xff0c;里面包含组装新镜像时用到的基础镜像和各种指令&#xff0c;使用dockerfile 文件来定义镜像&#xff0c;然后运行镜像&#xff0c;启动容器。 dockerfile文件的组成部分 一个dockerfile文件包含以下部分&#xff1a; 基础镜像信息&…...

C语言学习系列-->看淡指针(3)

文章目录 一、字符指针变量二、数组指针变量2.1 概述2.2 数组指针初始化 三、二维数组传参本质四、函数指针五、typedef关键字六、函数指针数组 一、字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* 一般使用&#xff1a; #include<stdio.h>int main…...

Java抽象类详解

抽象类 抽象类的概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类。比如&#xff1a; 说…...

06-微信小程序-注册程序-场景值

06-微信小程序-注册程序 文章目录 注册小程序参数 Object object案例代码 场景值场景值作用场景值列表案例代码 注册小程序 每个小程序都需要在 app.js 中调用 App 方法注册小程序实例&#xff0c;绑定生命周期回调函数、错误监听和页面不存在监听函数等。 详细的参数含义和使…...

多种方法实现 Nginx 隐藏式跳转(隐式URL,即浏览器 URL 跳转后保持不变)

多种方法实现 Nginx 隐藏式跳转(隐式URL,即浏览器 URL 跳转后保持不变)。 一个新项目,后端使用 PHP 实现,前端不做路由,提供一个模板,由后端路由控制。 Route::get(pages/{name}, [\App\Http\Controllers\ResourceController::class, getResourceVersion])...

视频汇聚云平台EasyCVR视频监控管理平台进行SDN转推的操作步骤

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…...

SQL 语句继续学习之记录二

三&#xff0c; 聚合与排序 对表进行聚合查询&#xff0c;即使用聚合函数对表中的列进行合计值或者平均值等合计操作。 通常&#xff0c;聚合函数会对null以外的对象进行合计。但是只有count 函数例外&#xff0c;使用count(*) 可以查出包含null在内的全部数据行数。 使用dis…...

【Python原创设计】基于Python Flask 机器学习的全国+上海气象数据采集预测可视化系统-附下载链接以及详细论文报告,原创项目其他均为抄袭

基于Python Flask 机器学习的全国上海气象数据采集预测可视化系统 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 在信息科技蓬勃发展的当代&#xff0c;我们推出了一款基于Python Flask的全国上海气象数…...

Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四)

文章目录 Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四)服务端客户端 Unity进阶–通过PhotonServer实现人物选择和多人同步–PhotonServer(四) 服务端 服务端结构如下&#xff1a; UserModel using System; using System.Collections.Generic; usin…...

【Go 基础篇】Go语言获取用户终端输入:实现交互式程序的关键一步

介绍 在许多编程场景中&#xff0c;我们需要编写交互式程序&#xff0c;以便用户可以在终端中输入数据并与程序进行交互。Go语言提供了丰富的方式来获取用户终端输入&#xff0c;使得编写交互式程序变得简单而有趣。本篇博客将深入探讨Go语言中获取用户终端输入的各种方法&…...

学习笔记:Opencv实现拉普拉斯图像锐化算法

2023.8.19 为了在暑假内实现深度学习的进阶学习&#xff0c;Copy大神的代码&#xff0c;记录学习日常 图像锐化的百科&#xff1a; 图像锐化算法-sharpen_lemonHe_的博客-CSDN博客 在环境配置中要配置opencv&#xff1a; pip install opencv-contrib-python Code and lena.png…...

如何在前端实现WebSocket发送和接收UDP消息(多线程模式)

目录 简介&#xff1a;步骤1&#xff1a;创建WebSocket连接步骤2&#xff1a;创建Web Workers步骤3&#xff1a;发送和接收UDP消息&#xff08;多线程模式&#xff09;结束语&#xff1a; 简介&#xff1a; 本文将继续介绍如何在前端应用中利用WebSocket技术发送和接收UDP消息…...

【微服务】一文了解 Nacos

一文了解 Nacos Nacos 在阿里巴巴起源于 2008 2008 2008 年五彩石项目&#xff08;完成微服务拆分和业务中台建设&#xff09;&#xff0c;成长于十年双十一的洪峰考验&#xff0c;沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。 随着云计算兴起&#xff0c; 2018 2018 20…...

量子计算对信息安全的影响:探讨量子计算技术对现有加密方法和信息安全基础设施可能带来的颠覆性影响,以及应对策略

第一章&#xff1a;引言 随着科技的迅猛发展&#xff0c;量子计算作为一项颠覆性的技术正逐渐走入我们的视野。量子计算以其强大的计算能力引发了全球科技界的广泛关注。然而&#xff0c;正如硬币的两面&#xff0c;量子计算技术所带来的不仅仅是计算能力的巨大飞跃&#xff0…...

ajax-axios-url-form-serialize 插件

AJAX AJAX 概念 1.什么是 AJAX ? mdn 使用浏览器的 XMLHttpRequest 对象 与服务器通信 浏览器网页中&#xff0c;使用 AJAX技术&#xff08;XHR对象&#xff09;发起获取省份列表数据的请求&#xff0c;服务器代码响应准备好的省份列表数据给前端&#xff0c;前端拿到数据数…...

【AIGC】单图换脸离线版软件包及使用方法

云端再好&#xff0c;都不如放自己手里啊&#xff0c;想怎么就怎么玩。云端再好&#xff0c;都不如放自己手里啊&#xff0c;想怎么就怎么玩。 Roop作为一个新出的开源项目&#xff0c;配置起来还是有一定难度的。 我已经把各种依赖&#xff0c;模型&#xff0c;环境配置已经…...

8.19论文阅读

文章目录 Graph-Segmenter: Graph Transformer with Boundary-aware Attention for Semantic Segmentation方法 SCSC: Spatial Cross-scale Convolution Module to Strengthen both CNNs and Transformers方法 Deformable Mixer Transformer with Gating for Multi-Task Learni…...

HAProxy

目录 HAProxy HAProxy介绍 主要特性 LVS、nginx、HAProxy区别 nginx LVS HAProxy 负载均衡策略 Haproxy搭建 Web 群集 Haproxy服务器 编译安装 Haproxy Haproxy服务器配置 添加haproxy 系统服务 节点服务器部署 日志定义 HAProxy HAProxy介绍 HAProxy是可提供高…...

基于EasyExcel的Excel读取

1.引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.11</version> </dependency>2.读取器代码&#xff1a; package com.vz.utils.excel;import com.alibaba.excel.Eas…...

链路聚合详解

链路聚合详解 华为交换机链路聚合&#xff1a;Linux链路聚合bond配置 华为交换机链路聚合&#xff1a; 方式一&#xff1a;配置手工负载分担方式的链路聚合 [CORE1] interface Eth-Trunk 1 [CORE1-Eth-Trunk1] trunkport GigabitEthernet 0/0/5 to 0/0/6 [CORE1-Eth-Trunk1] p…...

Shell编程学习之if分支语句的应用

Shell编程中的if分支语句&#xff1a;伪代码表示&#xff1a;注意符号和表达式之间的空格&#xff1b; if [ 表达式1 ] then分支1 elif [ 表达式2 ] then分支2 elif [ 表达式3 ] then分支3 else其它 fi按整型的方式&#xff0c;if分支语句比较字符串的大小&#xff1a;等于&am…...

2023.8 - java - 泛型

泛型问题的引出&#xff1a; jdk 1.5 引出泛型 // package 泛型; public class index {public static void main (String[] args){test t new test();t.setContent("aaa");int a (int) t.getContent();System.out.println(a);} }class test{Object content;publi…...

【数据结构练习】链表面试题锦集一

目录 前言&#xff1a; 1. 删除链表中所有值为key的节点 方法一&#xff1a;正常删除&#xff0c;头结点另外讨论 方法二:虚拟头结点法 方法三&#xff1a;递归 2.反转链表 方法一&#xff1a;双指针迭代 方法二&#xff1a;递归法解析&#xff1a; 3.链表的中间结点 方法…...

自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:SequentialChain和TransformationChain]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 SequentialChain 在调用语言模型之后&#xff0c;下一步是对语言模型进行一系列的调用。若可以将一个调用的输出作为另一个调用的输入时则特别有用。在本节中&#xff0c;我们将介绍如何使用顺序链来实现这一点。顺序…...

什么是卷积神经网络

目录 什么是卷积神经网络 全链接相对笨重&#xff1a;大胖子​编辑 ​编辑 参数众多&#xff1a;容易造成过拟合 ​编辑 卷积核&#xff1a;进行图像特征提取&#xff0c;源于卷积原理&#xff1a;求相交面积 卷积的作用 卷积的意义 ​编辑 通过卷积核减少参数 深度卷积…...

银行数字化转型程度-根据年报词频计算(2012-2021年)

银行数字化转型程度是根据银行年报中的数字化相关词频计算所得的数据。这一数据包括数字化词频关键词、以及数字化转型程度&#xff0c;反映了银行数字化转型的程度和进展情况。从经济学研究的角度来看&#xff0c;这一数据具有重要的参考价值。 首先&#xff0c;银行数字化转…...

微信开发之一键修改群聊备注的技术实现

修改群备注 修改群名备注后&#xff0c;如看到群备注未更改&#xff0c;是手机缓存问题&#xff0c;可以连续点击进入其他群&#xff0c;在点击进入修改的群&#xff0c;再返回即可看到修改后的群备注名&#xff0c;群名称的备注仅自己可见 请求URL&#xff1a; http://域名地…...

[oneAPI] 基于BERT预训练模型的SQuAD问答任务

[oneAPI] 基于BERT预训练模型的SQuAD问答任务 Intel Optimization for PyTorch and Intel DevCloud for oneAPI基于BERT预训练模型的SQuAD问答任务语料介绍数据下载构建 模型 结果参考资料 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Int…...

机器学习笔记之优化算法(十七)梯度下降法在强凸函数的收敛性分析

机器学习笔记之优化算法——梯度下降法在强凸函数的收敛性分析 引言回顾&#xff1a;梯度下降法在强凸函数的收敛性二阶可微——梯度下降法在强凸函数的收敛性推论 引言 上一节介绍并证明了&#xff1a;梯度下降法在强凸函数上的收敛速度满足 Q \mathcal Q Q-线性收敛。 本节将…...