使用Derby读取大数据(BLOB、CLOB)的问题

在使用Derby数据库时,遇到读取BLOB大数据时出现IOException,原因是当同一连接中存在其他Statement或ResultSet且连接为自动提交时,可能无法完整读取BLOB。解决方案是在读取前关闭其他Statement和ResultSet,或者设置连接为非自动提交模式,但后者可能引发连接池问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近在项目中使用derby读取BLOB时出现了一个错误:
java.io.IOException: ERROR 40XD0: Container has been closed.
at org.apache.derby.impl.store.raw.data.OverflowInputStream.fillByteHolder(Unknown Source)
at org.apache.derby.impl.store.raw.data.BufferedByteHolderInputStream.available(Unknown Source)
at java.io.FilterInputStream.available(Unknown Source)
at java.io.FilterInputStream.available(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at java.io.PushbackInputStream.read(Unknown Source)

在网上google一下,发现在derby中读取大数据时,如果同一个connection中还有其他的Statement或ResultSet,而且connection是自动提交的,那么就可能导致大数据无法全部读出来,如下面的示例:

public InputStream getData() {
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
    Statement stmt2 = null;
    ResultSet rs2 = null;
    try {
         stmt...
         rs...
         stmt2...
         return MyInputStream(con, stmt2, rs2);
    } finally {
        rs.close();
        stmt.close();        
    }
}
    也许上面的代码并不被建议使用,但是有的时候是迫不得已的。
    这样的代码在读取小数据量的BLOB的时候也许可以运行,但是如果读取的BLOB比较大,那么读到一半的时候就有可能出现上面给出的错误,其实原因就在于finally中将另外的Statement和ResultSet关闭了,这是就会导致一个事务的提交,从而导致获取大数据的流也关闭,不知道这样是不是合乎逻辑,不过在其他的数据库中似乎没有这样的问题。
    我的解决办法就是在stmt和rs结束之后,读取BLOB之前将其关闭,这样就不会有事务被提交了。当然还有另外一个解决办法,就是调用connection.setAutoCommit(false),但是这样的调用对使用了连接池的应用有隐患,一旦在方法结束后如果没有调用connection.setAutoCommit(true),那么导致非常严重的问题,所以我就没有采用这样的方法!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值