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

Dur*_*dal 3 java blob jdbc

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

BinaryHolder只是一个包装,holdes二进制数据(你问之前,代码执行罚款,直至到达最终条款- BinaryHolderUtil.create(BLOB)并没有试图释放BLOB).

进一步调查我发现在我们访问Blob的其他地方,blob只是使用getBlob()而不是完全免费获得(Javadoc说它会在结果集关闭时自动处理掉).

现在问题:blob 是否应该是free()'d'手动(在所有ResultSet之后可以保留不仅仅是访问blob),如果是,怎么可以free()'d甚至可以使用没有实现它的驱动程序?

(我们正在使用带有JTDS1.25的SQL-Server,如果从例外中看不出来的话)

Mar*_*eel 5

Blob.free()是在JDBC 4.0/Java 6中引入的.因此,您最有可能使用JDBC 3.0或更早版本的JDBC驱动程序.

与大多数(JDBC)资源一样,尽快关闭它们有其优点(例如,GC可以更早地收集它,释放数据库资源等).这就是为什么你可以关闭一个,ResultSet即使它在你关闭语句时关闭(或者再次执行语句),就像你可以关闭一个Statement偶数,虽然它在关闭时Connection关闭.

因此,一个Blob并不需要被释放,但它-一般-一个好主意,来释放它,当你用它做.

顺便说一句:JTDS只是JDBC 3.0,你最好使用微软自己的Microsoft SQL Server JDBC驱动程序.