使用MongoDB存储监控相关信息,偶尔会出现下面这个错误,无法从连接池获取MongoDB的链接信息,从错误提示上就是连接池不能使用了,但是有时候会成功,有时候会失败,这里记录一下失败的原因。
参考链接
mongoDB 常见三种异常解析 (附配置)
Exception: Interrupted acquiring a permit to retrieve an item from the pool
看了上面两个文章之后,就想到了可能是应用程序已经结束了,但是还有线程在使用MongoDB的连接,因此检查程序是否结束了,还有其他应用在使用MongoDB连接池。
解决思路
- 如果运行的main方式或者单元测试之类的,检查方法执行完之后是否还有其他任务在执行,尤其是使用多线程的时候需要检查,如果不好查找可以在主线程睡眠几十秒看看效果。
我的问题
我的问题主要是使用线程池去执行任务,线程池里面的任务还没执行完,主线程已经结束了,因为主线程把任务放到线程池之后就结束了,并没有等线程池执行完,所以主线程结束了,线程池还在执行,主线程执行了之后spring管理的bean也就都销毁了。
异常信息
com.mongodb.MongoInterruptedException: Interrupted acquiring a permit to retrieve an item from the pool
at com.mongodb.internal.connection.ConcurrentPool.acquirePermit(ConcurrentPool.java:203) ~[mongo-java-driver-3.11.2.jar:na]
at com.mongodb.internal.connection.ConcurrentPool.get(ConcurrentPool.java:140) ~[mongo-java-dri