2010-07-01 3 views
4

저는 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")))}))) 
+0

SQL Server는 데이터베이스의 성능을 향상시키기 위해 실행되는 쿼리에 대한 실행 계획을 캐시하여 쿼리가 실행될 때마다 최적화되지 않도록하는 방법과 비슷하게 들립니다. –

+0

MySQL에서 쿼리 캐싱에 대해 배우려면이 기사를 참조하십시오. http://www.databasejournal.com/features/mysql/article.php/3110171/MySQLs-Query-Cache.htm 그게 원인 일 수 있습니다. BTW, 캐시되는 것은 실제 결과 집합입니다. 실행 계획을 캐싱하면 반환 된 결과의 정확성에 아무런 영향을 미치지 않습니다. –

+0

이것이 MySQL과 관련이 없다고 생각합니다. Clojure 문제라고 생각합니다. –

답변

3

내가 문제가 있음을 수집 :

요청으로

, 여기에 SELECT 쿼리의 최상위 양식입니다 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

당신은 그것을 못 박았습니다. 당신의 도움을 주셔서 감사합니다! –

관련 문제