テーブルm1
には、何百万ものレコードがあります。テーブルm2
を作成し、すべてのレコードの計算をm1
にしたいと考えています。カーソルを使用しているclojure.java.jdbc内のネストされたトランザクション
(jdbc/with-db-transaction [tx connection]
(jdbc/query tx
[(jdbc/prepare-statement (:connection tx)
"select * from m1"
{:fetch-size 1000})]
{:result-set-fn (process! [tx result-set] ...)}))
process!
がselect
クエリが
(defn process! [tx result-set]
(jdbc/with-db-transaction [tx tx]
(jdbc/insert-multi! tx :m2 [:m2_column]
(mapv (fn [r] [(calculate r)])
result-set))))
ですし、いい加減に消費されています 私たちは次のように、現在、それを実行しています。参照:clojure.java.jdbc lazy query。それが外部トランザクションの内部にラップされている理由です。
質問:
- はPostgresのために問題のあるレコードが数百万の(ネストされた)トランザクションですか? clojure.java.jdbc docsでは、ネストされたトランザクションは外側のトランザクションによって吸収されるため、効果的には1つのトランザクションのみが使用されます。これは正しいです?
- インサート用に別々のトランザクションを使用する場合は、データベースへの別の接続を使用するソリューションですか?既に接続プーリングを使用しているため、これはすでに該当する場合がありますか?