当前位置: 首页 > 知识库问答 >
问题:

JDBC Blob(not)在使用后是否应该是free()?

赫连子石
2023-03-14

在处理一个包含二进制数据的旧数据库的导出时,我偶然发现了我们的一个实用方法中的一个异常:

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()(毕竟ResultSet可能不仅仅用于访问blob),如果是的话,如何使free()以一种即使没有实现它的驱动程序也能工作的方式呢?

(我们将SQL-Server与JTDS1.25一起使用,如果从异常中看不出这一点的话)

共有1个答案

陶飞英
2023-03-14

JDBC4.0/Java6中引入了blob.free()。因此,您最有可能使用的是JDBC3.0或更早的JDBC驱动程序。

与大多数(JDBC)资源一样,尽快关闭它们有其优点(例如GC可以更早地收集它,释放数据库资源等)。这也是为什么您可以关闭ResultSet,即使它在关闭语句时已经关闭(或再次执行语句),就像您可以关闭语句,即使它在关闭连接时已经关闭一样。

因此,blob不需要释放,但通常在使用完后释放它是个好主意。

 类似资料:
  • AccessibilityService在系统的内存管理方面与普通服务有何不同? 我想问的是:系统可以为了节省内存而关闭AccessibilityService吗?如果可以,当您进入AccessibilityService时,您会看到它打开还是关闭?用户是否必须再次手动打开? 使用startForeground是否有助于使AccessibilityService保持活动状态? 在一个类似的问题中,

  • 问题内容: 我正在创建一个新的SQL Server 2008数据库。我有两个相关的两个表。 第一个表如下所示: 第二张表如下所示: 每个品牌将至少具有一个型号,并且每个型号将仅属于一个品牌。 问题是,我应该像这样创建一个联结表吗? 还是我应该修改MODELS表以包括这样的BrandID 谢谢! 问题答案: 如果某个模型仅属于一个品牌,则可以在模型表上将FK放到该品牌上(您的第二种方法)。第一种方法

  • 问题内容: 在Java的JPA中(通过EmbeddedId或IdClass注释)似乎仅对复合数据库键提供第二类支持。当我阅读复合键时,无论使用哪种语言,人们都会碰到它们,因为这是一件坏事。但是我不明白为什么。如今,组合键是否仍然可以使用?如果没有,为什么不呢? 我发现一个同意我的人:http : //weblogs.sqlteam.com/jeffs/archive/2007/08/23/comp

  • 在nextjs项目中,我把后端返回给我的access_token加密之后存储到了cookie里面 然后我设置httpOnly,但是当我想要在客户端axios里面去获得这个token的的时候,我拿不到。 我想要改变一下这个cookie的性质,改成客户端可以访问的。但是我看很多帖子说,这样不安全。 我现在有点犹豫,如果每次取得token还要发个网络请求去获得,那这个性能损失太大了,但是吧,我改成浏览器

  • 现在想象一下我是这样使用的: 我被告知我应该删除,它们永远不能用于生产代码,只能用于测试。那是真的吗?