我们有一个n层应用程序,正在其中读取存储在postgres数据库中的BLOB对象。
有时,当我们尝试通过输入流访问blob对象时,在阅读其他博客后会收到“ org.postgresql.util.PSQLException:错误:无效的大对象描述符:0”,只要我们尝试在事务外部访问BLOB(已提交事务)。
但是,在本例中,即使事务处于活动状态,我们也会遇到此异常。在事务中读取BLOB。
任何有关为何即使事务处于活动状态也会发生此异常的指针吗?
答案 0 :(得分:0)
您对问题的描述没有具体信息,但是当我尝试在数据访问方法之外使用大对象时,在我的代码中显示了此错误。与您的情况一样,对象是在方法中形成的。这与在此论坛上其他人注意到的一致:大对象仅存在于数据访问方法(或事务)中。我需要byte [],所以我在方法中转换了大对象,将其包装在数据传输对象中,并能够在其他层中使用。这是相关的代码段:
//This is Data Access Class
@Named
public class SupportDocsDAO {
protected ResultSet resultSet;
private LargeObject lob;
// SupportDocs is an Entity class in Data Transfer Objects package
private SupportDocs supportDocsDTO;
public LargeObject getLob() {
return lob;
}
public void setLob(LargeObject lob) {
this.lob = lob;
}
public SupportDocs getSupportDocsDTO() {
return supportDocsDTO;
}
public void setSupportDocsDTO(SupportDocs supportDocsDTO) {
this.supportDocsDTO = supportDocsDTO;
}
//.... other code
public SupportDocs fetchSupportDocForDescr(SupportDocs supportDocs1) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.doWork(new Work() {
@Override
public void execute(java.sql.Connection connection) throws SQLException {
java.sql.PreparedStatement ps = null;
try {
LargeObjectManager lobm =
connection.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();
ps = connection.prepareCall("{call ret_lo_supportdocs_id(?)}");
ps.setInt(1, supportDocs1.getSuppDocId());
ps.execute();
resultSet = ps.getResultSet();
while (resultSet.next()) {
supportDocsDTO.setFileNameDoc(resultSet.getString("filenamedoc"));
supportDocsDTO.setExtensionSd(resultSet.getString("extensionsd"));
long oid = resultSet.getLong("suppdoc_oid");
setLob(lobm.open(oid, LargeObjectManager.READ));
//This is the conversion of Large Object into byte[]
supportDocsDTO.setSuppDocImage(lob.read(lob.size()));
System.out.println("object size: " + lob.size());
}
// other code, catch, cleanup with finally, and return supportDocsDTO
这没有问题。我可以从获得的byte []重新创建图像和视频。