只是从包含二进制数据的旧数据库中导出一个导出,我偶然发现了一个实用程序方法中的异常:
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是free()'d'手动(在所有ResultSet之后可能不只是访问blob),如果是如何它是否可以自由()以某种方式运行,即使对于没有实现它的驱动程序也是如此?
(我们正在使用带有JTDS1.25的SQL-Server,如果从例外中看不出来的那样)
答案 0 :(得分:5)
在JDBC 4.0 / Java 6中引入了Blob.free()
。因此,您最有可能使用JDBC 3.0或更早版本的JDBC驱动程序。
与大多数(JDBC)资源一样,尽快关闭它们有其优点(例如,GC可以更早地收集它,释放数据库资源等)。这就是为什么你可以关闭ResultSet
,即使它在你关闭语句时关闭(或再次执行语句),就像关闭Statement
一样,即使Connection
关闭Blob
{1}}已关闭。
因此{{1}}不会需要被释放,但通常情况下,最好在完成后释放它。
BTW:JTDS只是JDBC 3.0,你最好使用微软自己的Microsoft SQL Server JDBC驱动程序。