问题描述
使用Lettuce进行大量高并发操作时,一段时间后会报错:java.net.BindException: Address already in use: no further information
奇怪的发现,客户端即本地有大量的TIME_WAIT连接,连接目标是redis端
只要在application.yml加上lettuce的配置,就没有问题了,不加就会出现上述问题:
从代码检查参数的使用方式:
首先分析Lettuce的初始化方法:
'''
private LettuceClientConfigurationBuilder createBuilder(Pool pool) {
if (pool == null) {
return LettuceClientConfiguration.builder();
}
return new PoolBuilderFactory().createBuilder(pool);
}
'''
发现加不加配置,走的路径不同:
不加配置的话,不使用连接池,就会造成大量的短时连接
如果加上连接池配置,就会使用连接池,连接会被重用,不会造成大量短时的连接来不及回收
另外发现,连接池的空闲最大数目和活动数目改成一样,比较正常,如果空闲数目小于活动数目,也会出现之前的问题,
估计连接回收的太快了
网友评论