JDBC Blob(不是)在使用后是免费的()吗?

时间:2012-08-06 14:14:13

标签: java jdbc blob

只是从包含二进制数据的旧数据库中导出一个导出,我偶然发现了一个实用程序方法中的异常:

  

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,如果从例外中看不出来的那样)

1 个答案:

答案 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驱动程序。