【发布时间】:2017-02-22 15:53:16
【问题描述】:
我们有一个表m1,有数百万条记录。我们想生成一个表m2,其中包含m1 中每条记录的计算。
我们目前的运行方式如下:
(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! 在哪里
(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))))
select 查询正在使用游标并被延迟使用。请参阅:clojure.java.jdbc lazy query。这就是它被包裹在外部事务中的原因。
问题:
- 对于 Postgres 来说,具有数百万条记录的(嵌套)事务是否存在问题? clojure.java.jdbc docs 表示嵌套事务被外部事务吸收,因此实际上我们只有一个事务。这是正确的吗?
- 如果我们想为插入创建单独的事务,是否可以使用不同的数据库连接来解决?我们已经使用了连接池,所以可能已经是这种情况了?
【问题讨论】:
标签: postgresql jdbc clojure