Я пишу приложение 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))))
возвращает то же значение, независимо от количества вставленных элементов. Конечно, если я перезапущу веб-приложение, результаты будут обновлены, но это не очень удобно для работы с продуктом :).
Любая идея, почему это происходит? Заранее спасибо.
В соответствии с просьбой, вот форма верхнего уровня для запроса на выборку:
(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 Это может быть причиной. BTW, то, что кэшируется, является фактическим набором результатов; кэширование только плана выполнения не повлияет на правильность возвращенных результатов. –
Я не думаю, что это имеет ничего общего с MySQL, я думаю, что это проблема Clojure. –