저는 Compojure TODO 앱과 MySQL을 기본 데이터 저장소로 쓰고 있습니다. 나는 다음과 같이 MySQL과 인터페이스 clojure.contrib.sql을 사용하고 있습니다 :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는 데이터베이스의 성능을 향상시키기 위해 실행되는 쿼리에 대한 실행 계획을 캐시하여 쿼리가 실행될 때마다 최적화되지 않도록하는 방법과 비슷하게 들립니다. –
MySQL에서 쿼리 캐싱에 대해 배우려면이 기사를 참조하십시오. http://www.databasejournal.com/features/mysql/article.php/3110171/MySQLs-Query-Cache.htm 그게 원인 일 수 있습니다. BTW, 캐시되는 것은 실제 결과 집합입니다. 실행 계획을 캐싱하면 반환 된 결과의 정확성에 아무런 영향을 미치지 않습니다. –
이것이 MySQL과 관련이 없다고 생각합니다. Clojure 문제라고 생각합니다. –