如何使用JDBC复制管理器将zip条目读取到postgres表中



我使用JDBC CopyManager库的copyout方法将postgres表作为csv文件备份到AWS S3存储桶中。这是有效的。我将此备份保存为包含该文件的zip文件,以节省AWS存储桶中的空间。

我现在正在使用CopyManager库的copyin方法将备份文件恢复到我的postgres表中,并且在读取压缩输入流时遇到了一个小问题。

如何访问zip条目并将其传递到复制管理器的copyin方法中?理想情况下,我不需要将任何数据保存到磁盘,作为S3和postgres之间的中间步骤。

我认为这是一个很好的开始,但ZipEntry不是一个输入流,所以必须有另外一两行代码才能将zip条目作为输入流传入。我在处理输入流方面没有太多经验,所以我想答案相当简单。

public void restoreWithCopyManager( int list_id, String backupFileName) throws IOException, SQLException {
Connection connection = db.getConnection();
CopyManager copyManager = new CopyManager(connection.unwrap(BaseConnection.class));
ImportBucketConfig bucketConf = Config.get().s3ImportBucket;
String fileFullPath = backupFileName;
S3InputStream in = new S3InputStream(bucket, fileFullPath, bucketConf.accessKeyId,
bucketConf.secretAccessKey, S3Util.findRegion(bucketConf.region));
ZipInputStream zis = new ZipInputStream(in);
ZipEntry zipEntry = zis.getNextEntry();

long res = copyManager.copyIn("COPY test_copy_table FROM STDIN WITH CSV", zipEntry);
zis.close();
connection.close();
} 

我找到了从ZipInputStream 复制条目的解决方案

您将ZipInputStream传递到复制函数中,但必须首先对zip输入流执行getNextEntry((,才能将指针设置为zip条目。

ZipInputStream zis = new ZipInputStream(in);
zis.getNextEntry();
long res = copyManager.copyIn("COPY test_copy_table FROM STDIN WITH CSV", zis);

最新更新