JBoss 4.2.3 AS で動作する EJB 3.0 と Hibernate を使用するアプリケーションと、EJB によって制御されるトランザクションがあります。
「エラー: 無効なラージ オブジェクト記述子: 0」や「エラー: ラージ オブジェクト 488450 が存在しません」などのラージ オブジェクトに関するいくつかのメッセージが Postgres ログに出力されるという問題に直面していました。その結果、アプリケーションではすべてが正常に機能しましたが、休止状態のコミット後 (メソッドと呼ばれるメイン EJB のすべてのコードが実行された後)、Postgres がトランザクションをコミットできない場合がありました (常にではありません)。
レガシ コードを調査したところ、データベース内のファイル ストレージを表すすべてのエンティティのスーパークラスが見つかりました。このクラスでは、ファイルは 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();
}
このコードにコメントした後、すべてがうまくいくように見えました。質問は次のとおりです。それは必要ですか?データベース側でエラーを引き起こしているこのコードの実行により、内部で何が起こっているのかを理解したいと思います。