防止mongodb死于'state should be: open'
Prevent mongodb from dying with 'state should be: open'
我在多线程 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.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)
我发现了很多其他解决这个问题的方法,它们都通过在某处删除一些 conn.close()
调用来解决。
我有一个在启动时创建的连接,我唯一调用 close
的地方是在关机期间。 java 驱动程序管理一个线程池,所以我也不完全确定我们在谈论什么连接。从查询返回的 DbObject 是否有自己的专用连接,并且是这个连接正在消亡?
我已经尝试通过指定 :socket-keep-alive true
并明确将 :socket-timeout
设置为 0(这是默认值,意味着无限制)来解决此问题,但无济于事。
Monger 中有一些 with-open 的用法,我认为这可能会导致我遇到的问题。如果有一些与 db 对象相关联的连接被传递到这里,它被关闭,我尝试删除所有 db 对象的重用,但没有效果。
另一个想法是with-open
可能会与内部的懒惰的东西交互不良,但是将所有内容包装在 doall
中以使其变得急切也没有任何效果。
我 运行 反对副本集,我 运行 在本地 mongodb 和 ReadPreference/secondary
.
关于可能出现的问题还有其他想法吗?
在我的应用程序中剥离惰性层之后,异常变成了类似 "DB cursor not found" 的东西。那时很明显出了什么问题,通过使用 notimeout
管理我自己的光标,而不是使用 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.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)
我发现了很多其他解决这个问题的方法,它们都通过在某处删除一些 conn.close()
调用来解决。
我有一个在启动时创建的连接,我唯一调用 close
的地方是在关机期间。 java 驱动程序管理一个线程池,所以我也不完全确定我们在谈论什么连接。从查询返回的 DbObject 是否有自己的专用连接,并且是这个连接正在消亡?
我已经尝试通过指定 :socket-keep-alive true
并明确将 :socket-timeout
设置为 0(这是默认值,意味着无限制)来解决此问题,但无济于事。
Monger 中有一些 with-open 的用法,我认为这可能会导致我遇到的问题。如果有一些与 db 对象相关联的连接被传递到这里,它被关闭,我尝试删除所有 db 对象的重用,但没有效果。
另一个想法是with-open
可能会与内部的懒惰的东西交互不良,但是将所有内容包装在 doall
中以使其变得急切也没有任何效果。
我 运行 反对副本集,我 运行 在本地 mongodb 和 ReadPreference/secondary
.
关于可能出现的问题还有其他想法吗?
在我的应用程序中剥离惰性层之后,异常变成了类似 "DB cursor not found" 的东西。那时很明显出了什么问题,通过使用 notimeout
管理我自己的光标,而不是使用 monger
,随机错误消失了。