簡體   English   中英

使用 Java 從另一台 postgres 服務器向 postgresql 服務器插入更多一百萬行的有效方法是什么?

[英]What's the effective way to insert more a million rows into postgresql server from another postgres server using Java?

我有兩個 postgresql 服務器,我需要從第一個服務器格式復制表行並轉換為另一種服務器格式(不同的列名)。

我使用 java 應用程序和 spring 引導和 jpa 存儲庫,它實現了方法 findAll stream 讀取提取大小 1000。

    @Query("select c from ExternalFormatEntity c")
    @QueryHints(@javax.persistence.QueryHint(name = "org.hibernate.fetchSize",
            value = Constants.DEFAULT_FETCH_SIZE))
    Stream<ExternalFormatEntity> findAllEntities();

閱讀后我批量轉換並插入 1000 行。

try (Stream<ExternalFormatEntity> allExtEntitiesStream = extFormatService.getAllEntities()) {
    LinkedList<CanonicalFormatEntity> canonicalEntityList = new LinkedList<>();
        allExtEntitiesStream.forEach(extEntity -> {
            if (Objects.nonNull(extEntity)) {
                canonicalEntityList.add(SomeConverter.convert(extEntity));
            }
            if (canonicalEntityList.size() >= DEFAULT_BATCH_SIZE) {
                List<CanonicalFormatEntity> copyList = new LinkedList<>(canonicalEntityList);
                canonicalEntityList.clear();
                Thread thread = new Thread(() -> {
                    canonicalEntityRepository.saveAll(copyList);
                    canonicalEntityRepository.flush();
                    copyList.clear();
                });
                thread.start();
            }
        });
}

在我看來,對於 100 萬條記錄,此操作的當前速度可以快於 1 小時。 我可以加快這個操作嗎,如果可以,該怎么做?

首先,我嘗試將第一個數據庫的表記錄轉換為CSV文件,保存在另一台服務器上,使用Postgres Copy Api下載,但由於額外操作硬盤,匯總時間仍然無法接受。

也許 postgres 有 stream 寫作或其他東西? 我無法在官方 postgresql 文檔中找到答案。

對於我的案例幫助下一個解決方案:

  1. 使用 zip 壓縮將外部表導出到 csv 文件(來自 StackOverflow 答案的示例: https://stackoverflow.com/a/3981807/3744622

  2. 將小 zip 文件復制到 /tmp 文件夾中的 postgres 服務器scp root@ext_server:/path/to/file root@target_server:/tmp/

  3. 從 csv 壓縮文件導入表(來自 StackOverflow 答案的示例: https://stackoverflow.com/a/46228247/3744622

我實現了大概10分鍾的總結時間。

謝謝大家,這是個好地方)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM