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?
theo dõi ngăn xếp có thể hữu ích – evanchooly