PostgreSQL是否支持流式传输以保存字节数组数据?

时间:2017-04-28 12:41:13

标签: java postgresql streaming mtom

我有以下任务:

  1. 通过SOAP传递文件
  2. 将文件保存在PostgreSQL数据库中
  3. 该文件应作为流传递。

    对于任务的第一部分,我使用了MTOM机制。它工作正常。对于第二部分,我尝试使用setBinaryStream方法。为了检查该方法是否真正流式传输,我将Java堆限制为128 Mb并传递了一个~900Mb的文件。结果我失去了内存异常。

    所以我尝试使用大对象。这种机制通常无异常。但我不想使用这种机制,因为在删除对象时需要额外的操作,并且出于某些安全考虑。

    这里使用了setBinaryStream的代码:

    conn = getConnection();
    PreparedStatement ps = null;
    DataHandler dh = streamType.getHandler();
    InputStream is = null;
    try {
        is = dh.getInputStream();
        ps = conn.prepareStatement("INSERT INTO files VALUES (?, ?)");
        ps.setString(1, streamType.getName());
        ps.setBinaryStream(2, is);
        ps.executeUpdate();
    } 
    ...
    

    这个大对象:

    conn = getConnection();
    DataHandler dh = streamType.getHandler();
    PreparedStatement ps = null;
    InputStream is = null;
    try {
        is = dh.getInputStream();
        conn.setAutoCommit(false);
        LargeObjectManager lobj = ((org.postgresql.PGConnection) conn).getLargeObjectAPI();
        int oid = lobj.create(LargeObjectManager.READ | LargeObjectManager.WRITE);
        LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);
        byte buf[] = new byte[65536];
        int s, tl = 0;
        while ((s = is.read(buf, 0, 65536)) > 0) {
            obj.write(buf, 0, s);
            tl += s;
        }
        obj.close();
        ps = conn.prepareStatement("INSERT INTO fileslo VALUES (?, ?)");
        ps.setString(1, streamType.getName());
        ps.setInt(2, oid);
        ps.executeUpdate();
        conn.commit();
    }
    ...
    

    可能还有其他方法可以在没有大对象的情况下将数据流式传输到数据库中吗?

0 个答案:

没有答案