2010-07-01 16 views
4

我正在編寫一個Compojure TODO應用程序,並將MySQL作爲主數據存儲。我使用clojure.contrib.sql如下與MySQL接口:Compojure + clojure.contrib.sql:正在緩存SELECT查詢。爲什麼?

(def db {:classname "com.mysql.jdbc.Driver" 
     :subprotocol "mysql" 
     :subname "//localhost:3306/todo" 
     :user "<user>" 
     :password ""}) 

我使用似乎工作的查詢,但結果似乎被緩存。例如,運行後

(with-connection db 
    (insert-values :todos 
    [:name] [name])) 

該值已成功插入到數據庫中。但是,

(defn sql-query [query] 
    (with-connection db 
    (with-query-results rows [query] 
     (into [] rows)))) 

返回相同的值,無論插入了多少項目。當然,如果我重新啓動網絡應用程序,結果會更新,但這看起來不太適合生產:)。

任何想法爲什麼會發生這種情況?提前致謝。

按照要求,這裏是SELECT查詢的頂級形式:

(def home-view 
    (render 
    (base {:title "Clojure Todo" 
      :content (apply str 
      (map #(% :name) 
       (sql-query "select * from todos")))}))) 
+0

這聽起來類似於SQL Server緩存爲了提高數據庫性能而運行的查詢的執行計劃的方式,從而防止每次執行查詢時優化查詢。 – 2010-07-01 23:17:03

+0

查看本文以瞭解MySQL中的查詢緩存:http://www.databasejournal.com/features/mysql/article.php/3110171/MySQLs-Query-Cache.htm這可能是原因。順便說一句,被緩存的東西是實際的結果集;緩存執行計劃不會影響返回結果的正確性。 – 2010-07-02 02:03:20

+0

我不認爲這與MySQL有什麼關係,我認爲這是一個Clojure問題。 – 2010-07-03 00:42:11

回答

3

從最近的更新問題文本一起對答案最近添加的評論我收集的問題與clojure.contrib.sql無關,它與defroutes的形式。

(defroutes todo (GET "/" [] home-view))表示匹配此路線的請求將收到home-view作爲回覆。現在home-view僅在評估(def home-view ...)表單時評估一次 - 特別是,關聯的SQL查詢只執行一次。

爲了解決這個問題,重寫home-view的功能,並具有路由調用它,也許像這樣:

(defn home-view [] 
    ...the render form from your old (def home-view ...) form goes here... 
) 

(defroutes todo (GET "/" [] (home-view))) 

然後home-view -the功能將在每次航線被觸發時被調用(並執行其每個這樣的調用一次SQL查詢)。

+0

你釘了它。謝謝你的幫助! – 2010-07-07 00:44:30

相關問題