只是将包含二进制数据的旧数据库的导出组合在一起,我偶然发现了我们的一个实用程序方法中的一个异常:
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)。
进一步调查我发现,在我们访问 Blob 的其他任何地方,blob 只是使用 getBlob() 获得的,根本没有释放(Javadoc 说当结果集关闭时它将自动处理)。
现在的问题:是否应该手动释放 blob(毕竟 ResultSet 的保存时间可能不仅仅是访问 blob),如果是,如何以一种即使使用没有实现它的驱动程序?
(我们正在使用带有 JTDS1.25 的 SQL-Server,如果这在异常中还不是很明显的话)