2016-11-02 10 views
7

Tôi đang sử dụng MongoDB trong một ứng dụng clojure đa luồng, sử dụng thư viện monger, và một trong những chủ đề sản xuất của tôi đang chết vớiNgăn chặn MongoDB từ chết với 'nhà nước nên là: mở'

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) 

Tôi đã tìm thấy một loạt các lần truy cập khác cho vấn đề này và tất cả đều được giải quyết bằng cách xóa một số cuộc gọi conn.close() ở đâu đó.

Tôi có một kết nối duy nhất mà tôi tạo khi khởi động và nơi duy nhất tôi gọi close là trong khi tắt máy. Trình điều khiển java quản lý một threadpool, vì vậy tôi không hoàn toàn chắc chắn những gì kết nối chúng ta đang nói về một trong hai. DbObject có được trả lại từ các truy vấn có kết nối riêng của nó không, và kết nối này có đang chết không?

Tôi đã thử khắc phục điều đó bằng cách chỉ định :socket-keep-alive true và đặt rõ ràng :socket-timeout thành 0 (đây là mặc định và có nghĩa là không giới hạn) không có kết quả.

Trong mong có một số cách sử dụng with-open mà tôi đã tìm ra có thể gây ra sự cố tôi đang gặp phải. Trên cơ hội tắt rằng có một số kết nối liên quan đến đối tượng db, được truyền vào đây, được đóng lại, tôi đã thử gỡ bỏ tất cả việc sử dụng lại các đối tượng db, nhưng điều đó không có hiệu lực.

Một suy nghĩ khác là with-open có thể tương tác xấu với nội dung lười biếng bên trong, nhưng gói mọi thứ trong một doall để làm cho nó háo hức cũng không có bất kỳ tác dụng nào.

Tôi đang chạy với tập bản sao và tôi đang chạy cục bộ trên slaveodod phụ với ReadPreference/secondary.

Bất kỳ ý tưởng nào khác về những gì có thể sai?

+0

theo dõi ngăn xếp có thể hữu ích – evanchooly

Trả lời

0

Sau khi lột bỏ các lớp lười biếng trong ứng dụng của tôi, ngoại lệ đã thay đổi thành một cái gì đó như "Không tìm thấy con trỏ DB". Tại thời điểm đó, điều hiển nhiên là sai và bằng cách quản lý con trỏ của riêng tôi với notimeout, thay vì sử dụng monger, các lỗi ngẫu nhiên biến mất.

Các vấn đề liên quan