使用Derby读取大数据(BLOB、CLOB)的问题
2008-09-20 09:33
375 查看
最近在项目中使用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),那么导致非常严重的问题,所以我就没有采用这样的方法!
在网上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),那么导致非常严重的问题,所以我就没有采用这样的方法!
相关文章推荐
- jdbc 使用PreparedStatement来存储和读取大数据(Blob或Clob)
- jdbc 使用PreparedStatement来存储和读取大数据(Blob或Clob)
- 如何在dotConnect for Oracle中使用BLOB和CLOB数据
- 使用 hibernate 存取大对象数据类型(clob和blob)
- 使用 ajax json(getJSON)从服务器读取数据,在IE下不更新问题解决
- 从CSV文件中读取数据,使用逗号','分割问题
- 关于使用PyTorch设置多线程(threads)进行数据读取而导致GPU显存始终不释放的问题
- 使用 hibernate 存取大对象数据类型(clob和blob)
- 使用ifstream读取文件的数据不完整的问题
- 插入和读取blob和clob类型数据
- C++类中包含string类型数据使用read和write实现文件读取和输出时遇到的问题
- Java使用jacob组件读取大量Excel数据,性能差的问题
- 从CSV文件中读取数据,使用逗号','分割问题
- 使用JDBC和Hibernate在oracle中插入和读取Blob数据的图片的java程序
- NRF24L01使用外部中断读取数据的问题
- 从CSV文件中读取数据,使用逗号','分割问题
- 使用DBLink方式同步远程数据库中含Blob、Clob字段表的问题解决
- 使用存储过程读取Oracle中的clob字段的数据
- 使用socket读取服务器发送的数据问题
- 使用DBLink方式同步远程数据库中含Blob、Clob字段表的问题解决