Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 在ring/compojure webapp中使用LevelDB_Clojure_Compojure_Ring_Leveldb - Fatal编程技术网

Clojure 在ring/compojure webapp中使用LevelDB

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

我正在尝试在一个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 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))))))