我有一个使用 EJB 3.0 和在 JBoss 4.2.3 AS 上运行的 Hibernate 和由 EJB 控制的事务的应用程序。
我遇到的问题是 Postgres 日志中有几条关于大对象的消息,例如“错误:无效的大对象描述符:0”,有时还有“错误:大对象 488450 不存在”。结果是应用程序中的一切工作正常,但有时(并非总是)Postgres 在休眠提交后无法提交事务(在主 EJB 调用方法中的所有代码正在执行之后)。
我调查了遗留代码,发现了代表数据库中文件存储的所有实体的超类。在此类中,文件由 Blob 属性表示,并由 getBinaryStream() 方法使用。我发现奇怪的是这个类的 finalize() 方法中的内容如下:
@Lob
@Basic(fetch = FetchType.LAZY)
@Column(name = "BIN_CONTENT", nullable = true, updatable = true)
protected Blob content;
@Override
protected void finalize() throws Throwable {
if (this.content != null) {
try {
IOUtils.closeQuietly(this.content.getBinaryStream());
} catch (Exception e) {
logger.severe("Error finalizing Blob stream");
}
try {
this.content.free();
} catch (AbstractMethodError e) {
} catch (SQLFeatureNotSupportedException e) {
} catch (UnsupportedOperationException e) {
} catch (Throwable e) {
logger.severe("Error finalizing Blob stream");
}
this.content = null;
}
super.finalize();
}
在我评论这段代码之后,一切似乎都运行良好。问题是:有必要吗?我想了解由于执行导致数据库端错误的代码而导致的内部情况。