防止mongodb死亡'状态应该是:打开'

exp*_*pez 7 multithreading clojure mongodb mongodb-java monger

我在一个多线程的clojure应用程序中使用mongodb,使用monger库,我的一个生产者线程正在死亡

java.lang.IllegalStateException: state should be: open
 at com.mongodb.assertions.Assertions.isTrue (Assertions.java:70)
    com.mongodb.connection.DefaultServer.getConnection (DefaultServer.java:84)
    com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection (ClusterBinding.java:86)
    com.mongodb.operation.QueryBatchCursor.getMore (QueryBatchCursor.java:205)
    com.mongodb.operation.QueryBatchCursor.hasNext (QueryBatchCursor.java:103)
    com.mongodb.MongoBatchCursorAdapter.hasNext (MongoBatchCursorAdapter.java:46)
    com.mongodb.DBCursor.hasNext (DBCursor.java:155)
    clojure.lang.RT$4.invoke (RT.java:512)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:525)
    clojure.core$seq__6416.invokeStatic (core.clj:137)
    clojure.core$map$fn__6875.invoke (core.clj:2719)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:525)
    clojure.core$seq__6416.invokeStatic (core.clj:137)
    clojure.core$map$fn__6875.invoke (core.clj:2719)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:525)
    clojure.core$seq__6416.invokeStatic (core.clj:137)
    clojure.core$filter$fn__6902.invoke (core.clj:2782)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.ChunkedCons.chunkedNext (ChunkedCons.java:59)
    clojure.lang.ChunkedCons.next (ChunkedCons.java:43)
    clojure.lang.RT.next (RT.java:703)
    clojure.core$next__6400.invokeStatic (core.clj:64)
    clojure.core$dorun.invokeStatic (core.clj:3115)
    clojure.core$doall.invokeStatic (core.clj:3121)
    clojure.core$doall.invoke (core.clj:3121)
    myapp.ns1.$somefn.invokeStatic (ns1.clj:93)
    myapp.ns1.$somefn.invoke (ns1.clj:90)
    myapp.ns1$anotherfn.invokeStatic (ns1.clj:124)
    myapp.ns1$anotherfn.invoke (ns1.clj:116)
    myapp.ns2$doit.invokeStatic (ns2:21)
    myapp.ns2$doit.invoke (ns2:17)
    myapp.ns2$producer$fn__11200.invoke (ns2:45)
    myapp.ns2$producer.invokeStatic (ns2:31)
    myapp.ns2$producer.invoke (ns2:25)
    myapp.ns2$_start$fn__11230.invoke (ns2:70)
    clojure.core$binding_conveyor_fn$fn__6766.invoke (core.clj:2020)
    clojure.lang.AFn.call (AFn.java:18)
    java.util.concurrent.FutureTask.run (FutureTask.java:266)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:617)
    java.lang.Thread.run (Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

我已经找到了这个问题的一堆其他命中,他们都通过删除conn.close()某处的调用解决了.

我有一个连接,我在启动时创建,我唯一的地方close是在关机期间.java驱动程序管理一个线程池,所以我不完全确定我们正在谈论的是什么连接.从查询返回的DbObject是否有自己的专用连接,这个连接是否正在死亡?

我已经尝试通过指定:socket-keep-alive true并明确设置:socket-timeout为0(这是默认值并且意味着无限制)来修复它无济于事.

在monger中有一些使用with-open,我认为这可能会导致我遇到的问题.如果有一些与db对象关联的连接,在这里被传递关闭,我已经尝试删除所有重用db对象,但这没有任何效果.

另一个想法是,它with-open可能会与内部的懒惰内容发生严重冲突,但是将所有内容包装在一起doall以使其渴望也没有任何效果.

我正在运行副本集,我正在本地运行在奴隶mongodb上ReadPreference/secondary.

关于可能出错的其他任何想法?

exp*_*pez 2

在剥离我的应用程序中的惰性层后,异常更改为“未找到数据库游标”之类的内容。那时,很明显出了什么问题,通过使用 管理我自己的光标notimeout,而不是使用monger,随机错误消失了。