我正在編寫一個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")))})))
這聽起來類似於SQL Server緩存爲了提高數據庫性能而運行的查詢的執行計劃的方式,從而防止每次執行查詢時優化查詢。 – 2010-07-01 23:17:03
查看本文以瞭解MySQL中的查詢緩存:http://www.databasejournal.com/features/mysql/article.php/3110171/MySQLs-Query-Cache.htm這可能是原因。順便說一句,被緩存的東西是實際的結果集;緩存執行計劃不會影響返回結果的正確性。 – 2010-07-02 02:03:20
我不認爲這與MySQL有什麼關係,我認爲這是一個Clojure問題。 – 2010-07-03 00:42:11