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

时间:2018-03-23 08:55:49

标签: java postgresql inputstream resultset

在我的Java App中使用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();

在阅读表格时,我使用相同的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();
            }

然而,当我尝试阅读流时,我得到一个例外:

int number = inputStream.read()

或者

byte[] byteArray = new byte[1024];
int number = inputStream.read(byteArray);

例外:

  

org.postgresql.util.PSQLException:错误:无效的大对象   descriptor:0

我总结了这里的代码,因为在我的应用程序中它是分发的。关键是,当流来自的db连接已经关闭时,当前读取输入流中的内容。但是,代码过去曾经用于postgres,而且仍然适用于oracle。我尝试使用postgres驱动程序9.3以及42.1.4和Postgres 9.2。

我的问题:源自sql结果集的java输入流是否独立于db连接和结果集的状态?

1 个答案:

答案 0 :(得分:0)

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

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