只编写一个将给定对象保存到sqlite的函数

时间:2011-08-27 16:16:05

标签: clojure

我只是开始使用clojure,而且我一直在思考如何实现看似简单的功能。

有一个函数generator,它将saver函数作为参数。 generator会执行各种操作并定期生成某些数据对象,这些数据对象需要保存。此保存应由saver函数处理,因此generator每次生成数据时都会使用需要保存的数据调用saver

现在,我要编写的一个saver函数是将数据保存到sqlite db的函数。我应该怎么做呢?

  • 我想到的一个策略是在saver函数中创建与sqlite数据库的连接。每次要保存数据时创建新连接,保存数据(一个表中只有一行)并关闭连接。这似乎有点低效。特别是考虑到数据每2-5秒产生一次。

  • 另一个想法是将开放连接保持为模块级var,在开始时将其设置为nil。第一次调用saver函数时会打开连接,并在后续调用中重用该连接。这似乎可能更有效,但据我所知,它需要def函数内的saver形式。就个人而言,我不喜欢这样做。

  • 还有一个(疯了?)以为我曾经使用过保存连接对象的代理,最初设置为nilsaver将是send到代理的数据的函数。代理程序在第一次需要时创建连接,并保存在其关联的数据对象中。这看起来可能效果很好,但代理商不是为此设计的,不是吗?

那么,你们如何解决问题呢?还有其他适用于这种情况的范例吗?或者我应该做以上其中一种吗?

PS。我花了很多时间写这篇文章,因为很难用语言表达我的问题。我不确定我是否做得好。如果有什么不清楚,请告诉我。

1 个答案:

答案 0 :(得分:2)

你的第二个解决方案听起来最好。如果您不想使用可变Var(通过def创建),那么您可以在“工厂”函数中创建连接作为一个简单的不可变值(因此它只是在闭包中携带) ):

(defn sqlite-saver-factory [path]
  (let [db-connection (open-sqlite-connection path)]
    (fn [data]
      (save-to-sqlite db-connection data))))
...
(generator (sqlite-saver-factory path) ...)
免责声明:我不是一个伟大的clojure专家 - 上面就是我将如何在几乎所有功能语言中做到这一点。所以也许有更惯用的clojure方法。