只是从包含二进制数据的旧数据库中导出一个导出,我偶然发现了一个实用程序方法中的异常:
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,如果从例外中看不出来的话)
它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驱动程序.
| 归档时间: |
|
| 查看次数: |
3308 次 |
| 最近记录: |