我们有一个n层应用程序,我们正在读取postgres数据库中存储的BLOB对象。
有时,当我们试图通过输入流访问blob对象时,我们会得到“org . PostgreSQL . util . psql exception:ERROR:invalid large-object descriptor:0”在阅读其他博客后,每当我们试图在事务之外访问BLOB时(事务已提交),都会出现此异常。
但是,在我们的例子中,即使事务处于活动状态,我们也会得到这个异常。BLOB是在事务中读取的。
关于为什么即使事务处于活动状态也会发生此异常的任何指针?
您对问题的描述没有细节,但是在我的代码中,当我尝试在数据访问方法之外使用大型对象时,会出现此错误。与您的情况一样,对象是在方法中形成的。这与其他人在此论坛中注意到的内容一致:大型对象仅存在于数据访问方法(或事务)中。我需要 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
这没有问题。我可以从获得的字节[]重新创建图像和视频。
在我的Java应用程序中,我使用LargeObject接口编写lo(大型对象)类型的二进制数据: 读取表时,我使用相同的api来获取输入流: 但是,当我尝试读取流时,我得到一个异常: 或者替代地 例外: org.postgresql.util。PSQLException:错误:大型对象描述符无效:0 我在这里总结了代码,因为在我的app里是分布式的。关键是当前来自inputstream的内容被读取
一般来说,一个描述器是一个有“绑定行为”的对象属性 (object attribute),它的访问控制被描述器协议方法重写。 这些方法是 __get__(), __set__() , 和 __delete__() 。 有这些方法的对象叫做描述器。 默认对属性的访问控制是从对象的字典里面 (__dict__) 中获取 (get) , 设置 (set) 和删除 (delete) 。 举例来说, a.x
概述 JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等等。这个内部数据结构称为“属性描述对象”(attributes object)。每个属性都有自己对应的属性描述对象,保存该属性的一些元信息。 下面是属性描述对象的一个例子。 { value: 123, writable: false, enumerable: true,
本文向大家介绍Python中的类与对象之描述符详解,包括了Python中的类与对象之描述符详解的使用技巧和注意事项,需要的朋友参考一下 描述符(Descriptors)是Python语言中一个深奥但却重要的一部分。它们广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具箱添加一个额外的技巧。为了给接下来对描述符的讨论做一些铺垫,我将描述一些程序员可能会在日常编程活动中遇到
Python 中,通过使用描述符,可以让程序员在引用一个对象属性时自定义要完成的工作。 本质上看,描述符就是一个类,只不过它定义了另一个类中属性的访问方式。换句话说,一个类可以将属性管理全权委托给描述符类。 描述符是 Python 中复杂属性访问的基础,它在内部被用于实现 property、方法、类方法、静态方法和 super 类型。 描述符类基于以下 3 个特殊方法,换句话说,这 3 个方法组成
当定义了一个有很多方法的类型时,十之八九你会使用 String() 方法来定制类型的字符串形式的输出,换句话说:一种可阅读性和打印性的输出。如果类型定义了 String() 方法,它会被用在 fmt.Printf() 中生成默认的输出:等同于使用格式化描述符 %v 产生的输出。还有 fmt.Print() 和 fmt.Println() 也会自动使用 String() 方法。 我们使用第 10.4