2016-11-02 29 views
7

Ben monger kitaplığını kullanarak, bir çok iş parçacıklı Clojure app MongoDB kullanıyorum ve benim yapımcı parçacığı biriönle mongodb 'devlet olmalıdır: Açık'

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) 

ile ölüyor ben ettik Bu sorun için diğer hitlerin bir demet bulundu ve hepsi bir yerde bazı conn.close() çağrı kaldırarak çözüldü.

Başlangıcımda oluşturduğum tek bir bağlantım var ve kapattığımda close'u aradığım tek yer var. Java sürücüsü bir threadpool yönetir, bu yüzden ne hakkında konuştuğumuzdan emin değilim. Sorgulardan döndürülen DbObject öğesinin kendi özel bağlantısı var mı ve bu bağlantı ölüyor mu?

:socket-keep-alive true belirtilerek düzeltmeyi denedim ve :socket-timeout'u 0'a (varsayılan olanı ve sınırsız olanı) açık olarak ayarlama.

Uzun yıllardır, with-open'un bir kullanımım var, bu da benim yaşadığım problemin neden olabileceğini düşündüm. Db nesnesiyle ilişkili bir bağlantı olduğu ihtimaline karşı, burada kapatılan, kapatılan, db nesnelerinin tüm yeniden kullanımlarını kaldırmayı denedim, ancak hiçbir etkisi olmadı.

Başka bir düşünce, with-open'un içerideki tembel şeyler ile kötü etkileşimde bulunabilmesiydi, ancak her şeyin bir etkisi olmadığından emin olmak için bir doall numaralı telefona sarılmasıydı.

Bir çoğaltma kümesine karşı çalışıyorum ve ReadPreference/secondary ile slave mongodb'de yerel olarak çalışıyorum.

Neyin yanlış olabileceğine dair başka bir fikir var mı?

+0

yığın izleme yararlı olabilir – evanchooly

cevap

0

Uygulamamdaki tembelliği azalttıktan sonra istisna "DB imleci bulunamadı" gibi bir şeye dönüştü. Bu noktada, neyin yanlış olduğunu ve monger kullanmak yerine, kendi imlecimi notimeout ile yöneterek, rastgele hatalar ortadan kalktı.