4

jndiを使用してデータベースへの接続を作成するClojureWebアプリがあります。データベースをクエリするコードは次のようになります。

(def jndi-name {:name "jndi name"})

(defn query [q]
  (sql/with-connection {:name "jndi name"}
    (sql/with-query-results rs q
      (time (vec rs)))))

jndi構成は、jettyが起動されたときにjetty.xmlファイルからロードされます。ただし、REPLでは機能しないため、開発はやや非現実的です。

サーバーで実行されていないときに、jndiコンテキストが使用できないときに、db configがjetty.xmlではなくconfigファイルからロードされるようにコードを構造化する方法はありますか?

4

1 に答える 1

2

問題は、データベースへの接続方法が常にJNDIを介して行われるとは限らないことです。たとえば、テスト時またはREPLで、独自の接続プールを管理したい場合があります。

db仕様をvarとして保持することをお勧めします。したがって、コードへの唯一の変更は、変数の名前を変更することです。再バインドする予定なので、アスタリスクを使用するのが一般的です。

(def *db-spec* {:name "jndi name"})

(defn query [q]
  (sql/with-connection *db-spec*
    (sql/with-query-results rs q
      (time (vec rs)))))

(query "select * from Students")

そして、replでテストするときは、たとえばCommons-DBCPを使用して独自のデータソースを作成し、それにdb仕様を再バインドするだけです。

(def ds (doto (BasicDataSource.)
          (.setDriverClassName "oracle.jdbc.OracleDriver")
          (.setUsername "tiger")
          (.setPassword "scott")))

(binding [*db-spec* {:datasource ds}]
  (query "select * from Students"))
于 2011-03-31T14:31:48.537 に答える