Druid链接池的配置和使用

1.URL参数配置

1.1.实例:

jdbc:mysql://192.168.1.8:3306/mytest?serverTimezone=GMT%2B8&autoReconnect=true&allowMultiQueries=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&connectTimeout=60000&socketTimeout=60000

1.2.重要参数

官方URL的key-value参考

connectTimeout

建立链接需要的时间。该参数只在建立链接阶段生效。默认是0,不超时。建议配置connectTimeout=60000,单位毫秒。

socketTimeout

发送请求给数据库(建立链接后),数据库处理的最大时间;超过这个客户端报超时超时异常(Caused by: java.net.SocketTimeoutException: Read timed out)。默认是0,不超时。建议配置socketTimeout=60000,单位毫秒。

autoReconnect

是否自动重连。默认false。mysql服务端参数wait_timeout,其默认值为 28800秒(8小时),其意义为如果一个连接闲置超过这个选项所设置的秒数,MySQL会主动断开这个连接。如果无法保证应用程序在设定的秒数内至少有一次操作,添加autoReconnect=true这个参数,即能解决这个问题。

maxReconnects

autoReconnect设置为true时,重试连接的次数,默认3。

initialTimeout

autoReconnect设置为true时,两次重连之间的时间间隔,默认2,单位:秒

useSSL

使用ssl,默认为true(5.5.45+, 5.6.26+, 5.7.6+ or 8.0.13+)。根据情况改成false

allowMultiQueries

支持批量操作:在sql语句后携带分号,实现多语句执行;执行批处理,同时发出多个SQL语句。默认为false。建议设置为true

useUnicode 和 characterEncoding

指定数据库的编解码格式。根据具体情况配置。建议配置useUnicode=true&characterEncoding=UTF-8

2.Druid连接池配置

2.1.连接池的初始值、最大值、最小值

实例:

initialSize: 5
minIdle: 6
maxActive: 10

项目启动时,会自动初始化initialSize个连接出来(没有流量访问数据库也会创建),这几个链接会一直存在。可以通过数据库命令SHOW PROCESSLIST查看初始化的链接是5个:

image-20211223155157219

当客户端查询数据库的并发小于5时,就一直使用这五个链接;当客户端的并发5时,会慢慢的新建链接,直到最多建了10个链接为止。并发大于10时,其他的请求就需要等待可用的链接。

image-20211223155600222

当客户端的流量下来后,就会回收部分空闲链接,最终保留6个链接。

image-20211223155740891

在Druid的链接池中,maxIdle已经不在使用了,

2.2.获取连接的等待时间

实例:

maxWait: 6000

获取连接池中的连接时的最大等待时间,单位是毫秒。如果这个时间内未获得可用链接则报错:nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 6000, active 10, maxActive 10, creating 0。这个报错表明获取链接超时了,而且数据库的10个链接都被占用,也不能创建新的链接了。

2.3.回收连接池中的链接

实例:

timeBetweenEvictionRunsMillis: 2000
minEvictableIdleTimeMillis: 10000

访问流量大的时候,连接池中的连接数是maxActive: 10,但是当流量下来后,需要回收部分空闲的链接,最终让连接池中保留至少minIdle: 6个链接。回收的过程就需要定时对连接进行检查,判断连接是否应该回收。上面的配置就是每隔timeBetweenEvictionRunsMillis: 2000ms对连接池的连接做一次检查,如果有连接空闲时间超过minEvictableIdleTimeMillis: 10000ms就回收该链接(连接保持空闲而不被驱逐的最小时间)。

timeBetweenEvictionRunsMillis的具体作用有两个:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2)testWhileIdle的判断依据,详细看testWhileIdle属性的说明。

2.4.校验链接池中的链接是否有效

实例:

validationQuery: SELECT 1
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
validationQueryTimeout:10    

校验链接是否有效。

校验的方式:使用待校验的连接在在数据库上执行一下校验的sql,这里使用SELECT 1,一定要保证改sql是该数据能执行的,不同的数据库的校验sql可能不一样。

校验的时机:通常是在连接空闲时校验(testWhileIdle: true),也可以在获取连接时校验(testOnBorrow: true,这个配置会降低性能),也可以在归还连接到连接池时校验(testOnReturn: true,这个配置会降低性能)。

validationQueryTimeout是检测连接是否有效的超时时间,单位:秒。

如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。

2.5.事务控制

# 事务控制 默认true
defaultAutoCommit: true
# 默认    
defaultTransactionisolation:    

这两个参数通常使用默认值,事务会自动提交。如果defaultAutoCommit=false,即使在不加@Transactional主键的情况下,执行DQL,在数据库中也会出现事务(当DQL执行时间较长时,可以通过SELECT * FROM information_schema.innodb_trx查看到事务的存在)。

Druid链接池的事务默认配置可以在源码中看到:

image-20211223164741929

3.阿里官方druid参考配置

Druid连接池的官方参考配置:

image-20211223163420718

DruidDataSource配置属性列表:

image-20211223164509618

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ctgjedispool是一个基于Jedis实现的连接池库,可以用来连接Redis数据库。 以下是ctgjedispool连接池配置步骤: 1. 添加ctgjedispool依赖 在项目的pom.xml文件中添加以下依赖: ``` <dependency> <groupId>com.ctgjedispool</groupId> <artifactId>ctgjedispool</artifactId> <version>1.0.0</version> </dependency> ``` 2. 配置连接池参数 在项目的配置文件中,添加以下连接池参数: ``` #Redis服务器地址 redis.host=127.0.0.1 #Redis服务器端口 redis.port=6379 #Redis服务器密码 redis.password=123456 #连接池最大连接数 redis.maxTotal=500 #连接池最大空闲连接数 redis.maxIdle=10 #连接池最小空闲连接数 redis.minIdle=2 #获取连接时的最大等待毫秒数 redis.maxWaitMillis=10000 #在获取连接的时候检查有效性,默认为false redis.testOnBorrow=false #在归还连接的时候检查有效性,默认为false redis.testOnReturn=false ``` 3. 创建连接池 在Java代码中,使用以下代码创建连接池: ``` JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(Integer.parseInt(env.getProperty("redis.maxTotal"))); config.setMaxIdle(Integer.parseInt(env.getProperty("redis.maxIdle"))); config.setMinIdle(Integer.parseInt(env.getProperty("redis.minIdle"))); config.setMaxWaitMillis(Integer.parseInt(env.getProperty("redis.maxWaitMillis"))); config.setTestOnBorrow(Boolean.parseBoolean(env.getProperty("redis.testOnBorrow"))); config.setTestOnReturn(Boolean.parseBoolean(env.getProperty("redis.testOnReturn"))); JedisPool jedisPool = new JedisPool(config, env.getProperty("redis.host"), Integer.parseInt(env.getProperty("redis.port")), 10000, env.getProperty("redis.password")); ``` 4. 使用连接池 使用连接池从Redis数据库中获取连接,进行相关操作: ``` try (Jedis jedis = jedisPool.getResource()) { // 使用jedis进行相关操作 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值