在我的Java应用程序中,使用LargeObject Interface写入类型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: 错误: 无效的大对象 描述符:0
我在这里总结了代码,因为在我的应用程序中它是分布式的。关键是当前读取输入流中的内容,而流来自的数据库连接已经关闭。但是,该代码前段时间曾经适用于 postgres,现在仍然适用于 oracle。我尝试将 postgres 驱动程序 9.3 和 42.1.4 与 Postgres 9.2 一起使用。
我的问题:从 sql 结果集派生的 java 输入流是否独立于数据库连接和结果集的状态?
关闭大对象后,无法读取它。
此外,打开和读取大型对象必须在一个数据库事务中进行。大型对象在事务结束时关闭。