Postgres 和大对象:无效的大对象描述符:0

fli*_*ixe 1 java postgresql inputstream resultset

在我的 Java 应用程序中,我使用 LargeObject 接口编写 lo (大对象)类型的二进制数据:

        LargeObjectManager lLOManager = ((org.postgresql.PGConnection) aDatabaseConnection).getLargeObjectAPI();
        long oid = lLOManager.createLO();
        LargeObject lo = lLOManager.open(oid, LargeObjectManager.WRITE);

        if (aBLOB != null)
            lo.write(aBLOB);

        lo.close();
Run Code Online (Sandbox Code Playgroud)

读取表格时,我使用相同的 api 来获取输入流:

LargeObjectManager lLOManager = ((org.postgresql.PGConnection) aDatabaseConnection).getLargeObjectAPI();
            long lOid = aRs.getLong(aIndex);
            if (lOid != 0)
            {
                LargeObject lObj = lLOManager.open(lOid, LargeObjectManager.READ);
                inputStream = lObj.getInputStream();
                lObj.close();
            }
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试读取流时,出现异常:

int number = inputStream.read()
Run Code Online (Sandbox Code Playgroud)

或者替代地

byte[] byteArray = new byte[1024];
int number = inputStream.read(byteArray);
Run Code Online (Sandbox Code Playgroud)

例外:

org.postgresql.util.PSQLException:错误:无效的大对象描述符:0

我在这里总结了代码,因为在我的应用程序中它是分布式的。要点是,当流来自的数据库连接已经关闭时,当前会读取输入流中的内容。然而,这段代码以前可以在 postgres 上运行,现在仍然可以在 oracle 上运行。我尝试将 postgres 驱动程序 9.3 以及 42.1.4 与 Postgres 9.2 一起使用。

我的问题:从 sql 结果集派生的 java 输入流是否独立于数据库连接和结果集的状态?

Lau*_*lbe 5

关闭大对象后,您将无法读取它。

此外,打开和读取大对象必须在一个数据库事务中进行。大对象在事务结束时关闭。