Clojure 在ring/compojure webapp中使用LevelDB
我正在尝试在一个ring/compojure应用程序中设置LevelDB,并寻找一种惯用的方法将打开的db描述符访问到每个请求中 例如:Clojure 在ring/compojure webapp中使用LevelDB,clojure,compojure,ring,leveldb,Clojure,Compojure,Ring,Leveldb,我正在尝试在一个ring/compojure应用程序中设置LevelDB,并寻找一种惯用的方法将打开的db描述符访问到每个请求中 例如: (defn -main "I don't do a whole lot ... yet." [& args] (println "Opening LevelDB file in db/main") (with-open [main-db (db/open "db/main")] (println "Running serve
(defn -main
"I don't do a whole lot ... yet."
[& args]
(println "Opening LevelDB file in db/main")
(with-open [main-db (db/open "db/main")]
(println "Running server on port 3000")
(run-jetty #'web/app {:port 3000})))
如何将main db
描述符访问到请求处理程序中
即:
(定义处理程序)
(获取“/测试”[]
(db/put主数据库(.getBytes“testKey2”)(.getBytes“testValue2”))
“你好,世界”)
PS:我正在使用Sedward的leveldb clj库,并将其打包成一个clojar:如果你想在你的应用程序中使用一个全局描述符,最简单的选择可能是在顶级变量中存储承诺或延迟:
(def level-db-descriptor (promise))
(defn open [...]
...
(deliver level-db-descriptor ...))
(open ...)
;; or
(def level-db-descriptor (delay (open ...)))
然后在需要时说@leveldb descriptor
如果您偶尔需要替换描述符,这并不是很好;但是,您也可以在保留@level db descriptor
使用模式的同时支持这一点:
(defprotocol PDescriptorBox
(put-descriptor! [this d])
(get-descriptor [this]))
(defn make-descriptor-box []
(let [box (clojure.lang.Box. nil)]
(reify
clojure.lang.IDeref
(deref [this] (get-descriptor this))
PDescriptorBox
(get-descriptor [this]
(locking this
(.-val box)))
(put-descriptor! [this d]
(locking this
(set! (.-val box) d))))))
当然,您可以用更复杂的东西来替换put descriptor!
(也许只有在对旧的描述符做了一些事情之后才能生成新的描述符)
如果您希望能够并行运行应用程序的多个实例,那么这些实例可能会使用某种状态容器,并且您可能希望使用这些状态容器来存储描述符,而不是顶级变量。谢谢!我实际上使用了一个更简单的解决方案,定义了一个使用描述符的函数像这样的参数:
(运行jetty(web/load with descriptor main db){:port 3000}))
并将路由的定义移动到该函数中,以便在该函数中定义描述符。您是否看到使用环形jetty的任何问题?还是使用netty更有意义?
(defprotocol PDescriptorBox
(put-descriptor! [this d])
(get-descriptor [this]))
(defn make-descriptor-box []
(let [box (clojure.lang.Box. nil)]
(reify
clojure.lang.IDeref
(deref [this] (get-descriptor this))
PDescriptorBox
(get-descriptor [this]
(locking this
(.-val box)))
(put-descriptor! [this d]
(locking this
(set! (.-val box) d))))))