如果JDBC斑点(不)是免费的()使用后倒是?(Should JDBC Blob (not) be

2019-09-20 21:56发布

刚刚打手枪一起从包含二进制数据的旧的数据库导出,我绊倒在我们的实用方法之一的除外:

java.lang.AbstractMethodError:net.sourceforge.jtds.jdbc.BlobImpl.free()

检查我们的代码库后,我发现这是从来没有使用过的工具方法到现在为止,bascially它看起来像这样:

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只是一个包装,holdes二进制数据(你问之前,代码执行罚款,直至到达最终条款- BinaryHolderUtil.create(BLOB) 尝试释放BLOB)。

进一步调查我发现,在其他地方,我们访问的Blob的使用getBlob()是刚刚获得的blob和完全不free'd(的Javadoc说,它会自动设置时,结果集是关闭的)。

现在问题: 如果斑点是免费的()“D手动(毕竟ResultSet中可持有多只访问BLOB),如果是怎么能免费()”在与工作连路D司机没有实现呢?

(我们使用SQL-Server和JTDS1.25,如果这是不是已经从异常明显)

Answer 1:

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

与大多数(JDBC)资源,尽快关闭它们尽可能有自己的优势(如GC能够更早地收集它,数据库资源被释放等)。 这也是为什么你可以关闭ResultSet ,当你关闭语句,即使它被关闭(或再次执行该语句),就像你可以关闭一个Statement ,即使当它关闭Connection被关闭。

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

BTW:JTDS只是JDBC 3.0,你会过得更好使用微软自己的Microsoft SQL Server的JDBC驱动程序。



文章来源: Should JDBC Blob (not) be free()'d after use?
标签: java jdbc blob