无效的大对象描述符:0个休眠和postgres

时间:2018-07-19 07:00:01

标签: postgresql hibernate

我们有一个n层应用程序,正在其中读取存储在postgres数据库中的BLOB对象。

有时,当我们尝试通过输入流访问blob对象时,在阅读其他博客后会收到“ org.postgresql.util.PSQLException:错误:无效的大对象描述符:0”,只要我们尝试在事务外部访问BLOB(已提交事务)。

但是,在本例中,即使事务处于活动状态,我们也会遇到此异常。在事务中读取BLOB。

任何有关为何即使事务处于活动状态也会发生此异常的指针吗?

1 个答案:

答案 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 []重新创建图像和视频。