项目出现问题,系统如果隔2min左右没有使用,再次使用时会很慢,等到第一次慢过之后,响应就恢复正常。
通过arthas进行追踪后,发现慢在了获取数据库连接上。
查看数据库配置,配置如下:
jdbc.pool.minIdle=0
jdbc.pool.maxIdle=10
jdbc.pool.maxActive=10
jdbc.pool.maxWait=30000
jdbc.pool.initialSize=1
minIdle:最小空闲线程数
maxIdle:最大空闲线程数
initialSize:初始化线程数
初始化线程数越大,第一次连接时间耗时越长,但一个线程池初始化1个线程还是太小了。
minIdle设置为0,网上说设置为0表示没有限制,但实际情况时线程池在线程空闲一段时间后,应该会把所有线程回收。
因此才会有隔一段时间,所有线程被回收,第一次发送请求后,需要初始化线程池。
为了证明一下假设,对配置文件进行修改
jdbc.pool.minIdle=20
jdbc.pool.maxIdle=20
jdbc.pool.maxActive=60
jdbc.pool.maxWait=30000
jdbc.pool.initialSize=20
重启系统后,没有再出现类似的情况。
珍惜创建线程,但也不要太小气,目前的服务器,配置20-100连接数,一般都没问题。