zoukankan      html  css  js  c++  java
  • MongoDB 线程中断异常

    报的异常如下

    org.springframework.data.mongodb.UncategorizedMongoDbException: Interrupted acquiring a permit to retrieve an item from the pool ; nested exception is com.mongodb.MongoInterruptedException: Interrupted acquiring a permit to retrieve an item from the pool
    at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:138) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2781) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:547) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.doUpdate(MongoTemplate.java:1578) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.doUpdate(MongoTemplate.java:1568) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.updateFirst(MongoTemplate.java:1537) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at com.biyou.service.ArticleServiceImpl.flushWeight(ArticleServiceImpl.java:209) ~[classes/:na]
    at com.biyou.OperationApplication.tast(OperationApplication.java:36) ~[classes/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_162]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_162]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_162]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_162]
    at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:84) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93) [spring-context-5.1.6.RELEASE.jar:5.1.6.RELEASE]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_162]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_162]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [na:1.8.0_162]
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [na:1.8.0_162]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_162]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_162]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162]
    Caused by: com.mongodb.MongoInterruptedException: Interrupted acquiring a permit to retrieve an item from the pool
    at com.mongodb.internal.connection.ConcurrentPool.acquirePermit(ConcurrentPool.java:203) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.internal.connection.ConcurrentPool.get(ConcurrentPool.java:140) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.internal.connection.DefaultConnectionPool.getPooledConnection(DefaultConnectionPool.java:262) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:103) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:92) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.internal.connection.DefaultServer.getConnection(DefaultServer.java:85) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection(ClusterBinding.java:114) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.operation.OperationHelper.withReleasableConnection(OperationHelper.java:424) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:191) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:67) ~[mongodb-driver-core-3.8.2.jar:na]
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:193) ~[mongodb-driver-3.8.2.jar:na]
    at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:960) ~[mongodb-driver-3.8.2.jar:na]
    at com.mongodb.client.internal.MongoCollectionImpl.executeUpdate(MongoCollectionImpl.java:951) ~[mongodb-driver-3.8.2.jar:na]
    at com.mongodb.client.internal.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:613) ~[mongodb-driver-3.8.2.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate$8.doInCollection(MongoTemplate.java:1625) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate$8.doInCollection(MongoTemplate.java:1578) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:545) ~[spring-data-mongodb-2.1.6.RELEASE.jar:2.1.6.RELEASE]
    ... 19 common frames omitted
    Caused by: java.lang.InterruptedException: null
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1326) ~[na:1.8.0_162]
    at java.util.concurrent.Semaphore.tryAcquire(Semaphore.java:409) ~[na:1.8.0_162]
    at com.mongodb.internal.connection.ConcurrentPool.acquirePermit(ConcurrentPool.java:197) ~[mongodb-driver-core-3.8.2.jar:na]
    ... 35 common frames omitted

    产生这个异常的原因在于,我项目中有一个定时任务 会定时改写 数据库里的文档,其实就是定时刷新 文档们的 权重分;

    我 另外一个线程(比如说浏览器线程)在 读 或 写  某个文档的 时候 ,两个线程撞了,   一个线程是定时任务 ,刚好刷新到这个文档,   一个线程刚好在读  or 写 这个文档  就报这个异常,

    这个异常不会规律重复出现,只是一个概率事件,

    解决思路,一个是给 刷新权重分 的定时任务线程加锁,避免线程相撞 ;同时降低定时任务的周期,降低线程相撞的概率;

  • 相关阅读:
    VS使用技巧
    写的一个简单定时器(非独立线程)
    C/C++技巧
    【转载】R6034错误,C Runtime Error
    C/C++面试题(一)
    常用的coco2d-x游戏开发工具(转)
    AndroidJNI 调用JAVA(转)
    Android SDK +Eclipse+ADT+CDT+NDK 开发环境在windows 7下的搭建
    简单的字符串压缩--C代码
    SQLite: sqlite_master(转)
  • 原文地址:https://www.cnblogs.com/cjd01/p/14146566.html
Copyright © 2011-2022 走看看