[英]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 文檔中找到答案。
對於我的案例幫助下一個解決方案:
使用 zip 壓縮將外部表導出到 csv 文件(來自 StackOverflow 答案的示例: https://stackoverflow.com/a/3981807/3744622 )
將小 zip 文件復制到 /tmp 文件夾中的 postgres 服務器scp root@ext_server:/path/to/file root@target_server:/tmp/
從 csv 壓縮文件導入表(來自 StackOverflow 答案的示例: https://stackoverflow.com/a/46228247/3744622 )
我實現了大概10分鍾的總結時間。
謝謝大家,這是個好地方)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.