2016-09-16 13 views
3

我知道组​​件和系统(虽然还没有使用它们),但我想知道如何初始化资源,当init方法可以从任何线程运行。假设我们有10个线程,并且它们都使用数据库,线程可以按任意顺序启动。在这种情况下,我如何初始化数据库连接池?什么是正确的方式来初始化Clojure中的多线程程序中的资源

我目前使用比较和设置来做到这一点,但不知何故,它感觉不对。 这就是我所做的。我不知道什么时候vm开始,当我的线程开始时(我正在使用风暴,db pool在一些螺栓中被初始化)。有一个更好的方法吗?

+1

你提到的组件和系统,你也可以看看[mount](https://github.com/tolitius/mount)以获得更自然的clojure感觉。 – Shlomi

+0

看起来很酷@Shlomi,会检查出来 – Ravi

回答

3

您想使用locking函数。它类似于Java中的​​。

请点击这里查看完整的文档:http://clojuredocs.org/clojure.core/locking

你那么代码将类似于:

(def datasource (atom)) 
(locking datasource 
    (when (nil? @datasource)) 
    (reset! datasource (make-datasource datasource-options)))) 

注意,你并不真正需要的原子内部的地图。

+0

看起来好多了。谢谢! – Ravi

相关问题