在我的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连接和结果集的状态?
答案 0 :(得分:0)
关闭它后,您无法从大对象中读取。
此外,在一个数据库事务中必须打开和读取大对象。大型对象在交易结束时关闭。