如何使用JDBC copymanager

问题描述

我正在使用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();
} 

解决方法

我找到了Copying Entries from ZipInputStream

的解决方案

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

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