バイナリ データを含む古い DB からのエクスポートをまとめてみたところ、ユーティリティ メソッドの 1 つで例外に遭遇しました。
java.lang.AbstractMethodError: net.sourceforge.jtds.jdbc.BlobImpl.free()
コードベースを確認したところ、ユーティリティ メソッドは今まで使用されていなかったことがわかりました。基本的には次のようになっています。
public BinaryHolder getBinary(final int columnIndex) throws SQLException {
Blob blob = null;
try {
blob = resultSet.getBlob(columnIndex);
final BinaryHolder binary = BinaryHolderUtil.create(blob);
return binary;
} finally {
if (blob != null)
blob.free();
}
}
BinaryHolder は、バイナリ データを保持する単なるラッパーです (質問する前に、コードは finally 句に到達するまで正常に実行されます - BinaryHolderUtil.create(blob) はblob を解放しようとしません)。
さらに調査したところ、ブロブにアクセスする他のすべての場所で、ブロブは getBlob() を使用して取得され、まったく解放されていないことがわかりました (Javadoc によると、結果セットが閉じられると自動的に破棄されます)。
今すぐ質問: blobを手動で free() する必要があります (結局のところ、ResultSet は blob にアクセスするだけでなく保持される可能性があります)。それを実装していないドライバー?
(例外からまだ明らかでない場合は、JTDS1.25でSQL-Serverを使用しています)