Clojure和JDBC将5,000,000行移动到另一个Postgresql数据库

阿基兹:

我正试图将5,000,000行从一个Postgre DB移到另一数据库。两个连接都在Hikari CP连接池中。

我浏览了许多文档和帖子。它给我留下了下面的代码。但这并不是真的可用:

(jdbc/with-db-connection [tx {:datasource source-db}]
  (jdbc/query tx
      [(jdbc/prepare-statement (jdbc/get-connection tx)
                                answer-sql
                                {:fetch-size 100000})]
                  {:result-set-fn (fn [result-set]
                                    (jdbc/insert-multi!
                                     {:datasource target-db}
                                     :migrated_answers
                                     result-set))}))

我已经尝试了很多不同的形式。jdbc/with-db-transaction或其他我能想到的没有太大帮助。

  1. 许多教程和帖子仅提及如何整体处理结果。用小表进入RAM绝对可以,但是看起来很快。但这种情况并非如此。

  2. 因此,当我正确使用:fetch-size并且我的RAM不会爆炸时,传输就非常慢,因为在DB端,两个连接都在“活动”和“事务中空闲”状态之间进行切换。我从来没有等那么久才找到实际传输的任何数据!

    当我在Talend Open Studio(生成Java代码的ETL工具)中创建此简单批处理时,它将在5分钟内传输所有数据。并且在那里的“游标大小”也设置为100000。我认为Clojure的干净代码应该更快。

  3. 我得到的最快结果是下面的代码。我认为是因为:as-array参数。如果我不使用:max-rows参数内存,因为它没有被延迟处理而爆炸,那么我就不能在整个transfet中使用它。为什么?我不明白这里的规则。

    (jdbc/with-db-transaction [tx {:datasource source-db}]
      (jdbc/query tx
                  [(jdbc/prepare-statement (:connection tx)
                                            answer-sql
                                           {:result-type :forward-only
                                            :concurrency :read-only
                                            :fetch-size 2000
                                            :max-size 250000})]
                  {:as-arrays? true
                   :result-set-fn (fn [result-set]
                                    (let [keys (first result-set)
                                          values (rest result-set)]
                                      (jdbc/insert-multi! 
                                         {:datasource dct-db}
                                          :dim_answers
                                           keys values)))}))
    

我将不胜感激任何帮助或信息,我将不胜感激。

阿基兹:

该解决方案最适合我,而且似乎比Taylor的解决方案更快。但是非常感谢您的帮助。

在事务完成之前,它不会提交。我必须遇到任何问题,看看是否不需要拉皮条,但我现在很高兴。我试图用替换第一个事务,with-db-connection但是它使记录直接加载到RAM中。

(defn data->transfer2 [sql table]
     (jdbc/with-db-transaction [read-tx {:datasource dag-db}]
     (jdbc/with-db-transaction [tx {:datasource dct-db}]
        (jdbc/query read-tx
                  [(jdbc/prepare-statement (:connection read-tx)
                                           answer-sql
                                           {:result-type :forward-only
                                            :concurrency :read-only
                                            :fetch-size 100000})]
                  {:as-arrays? true
                   :result-set-fn (fn [result-set]
                                    (let [keys (first result-set)
                                          values (rest result-set)]
                                      (doseq [btch (partition-all 100000 values)]
                                        (jdbc/insert-multi! tx
                                                            :dim_answers
                                                             keys
                                                             btch))))})))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将Azure数据库从一个帐户移动到Azure中的另一个帐户

将集合从同一MongoDB实例中的一个数据库移动到另一个数据库

如何将表从一个数据库移动到另一个数据库

将表从数据库移动到另一个-仅插入缺少的行

将数据从数据库移动到另一个数据库时出错

将大型SQL Server表从一个数据库移动到另一个数据库的最佳方法?

将存储库从一个隔离的网络移动到另一个

如何将数据从一个数据库(主serevr(sql))移动到android数据库(本地(sqlite))中的另一个数据库

将数据从一个mysql表移动到另一个

将数据从一个表移动到同一数据库中的另一个表

如何将SQL Server数据库移动到另一个数据库?

通过ODBC将数据从一个数据库移动到另一个数据库

将1个字段复杂地移动到另一个数据库中的一个字段所需的mysql查询

psql将数据移动到另一个表,而保留对新行的引用

将redmine数据库移动到另一个实例

将数据移动到另一个表

在特定时间将过期的sql条目移动到另一个数据库中

假设我的数据库中有一个+1,000,000,000,000,000的条目

Django将对象从一个数据库移动到另一个数据库

如何使用 C# 驱动程序将文档移动到 MongoDB 中的另一个数据库?

SQL 查询:将数据从一个数据库移动到另一个数据库

将 Azure SQL 数据库从资源组移动到另一个资源组

在mysql和php中将数据从一个数据库移动到另一个数据库时出错

将数量从一个位置部分移动到另一个位置和另一个位置的数据库模型

如何将数据库移动到mongodb中的另一个分片

InfluxDB:仅将多个数据库中的一个从一个服务器实例移动到另一个

PHP,用于将 db2 数据从一个数据库移动到另一个数据库的脚本

将表 postgresql 的一部分移动到另一个数据库

将数据发送到 Firebase 数据库后如何从片段移动到另一个片段?