`
speed_guo
  • 浏览: 314436 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

因连接关闭引起的Blob操作异常

阅读更多

在处理结果集的时候,做了一个处理,把记录都处理成了Map的对象,而把结果集处理成了一个List对象。
如下:
public List<Map<String, Object>> toList() throws SQLException {

            List<Map<String,Object>> recordsList = new ArrayList<Map<String, Object>>();
       
            ResultSetMetaData meta = rst.getMetaData();
            int colCnt = meta.getColumnCount();
           
            while(rst.next()){
               
                Map<String,Object> record = new HashMap<String, Object>();
               
                for(int i=0;i<colCnt;i++){
                    String colName = meta.getColumnName(i+1);
                    Object colValue = rst.getObject(colName);
                    log.debug(colValue);
                    if(colValue instanceof Blob){
                        log.debug("blob type");
                    }else{
                        record.put(colName, colValue);
                    }
                   
                }
               
                recordsList.add(record);
            }      
              
            return recordsList;
        }

之后,就关闭了resultset ,statement ,connection。然而在我从map对象里面取得blob对象时,总是报SQLException异常。经过调试,发现在blob.getBinaryStream()时发生异常。

无奈之下做了一个试验。

PreparedStatement stmt = null;
//        ResultSet rst = null;
//
//        try {
//            stmt = this.con
//                    .prepareStatement("SELECT * FROM CCX_INFO_ARTICAL WHERE ARTICAL_ID=?");
//            stmt.setLong(1, articalId);
//
//            rst = stmt.executeQuery();
//            if(rst.next()){
//                Blob b = rst.getBlob("ARTICAL_CONTENT");
//                log.debug(b);
////                InputStream in = b.getBinaryStream();
//               
//               
//               
//               
//                log.debug(in);
//               
//            }
//
//        } catch (SQLException e) {
//            throw e;
//        } finally {
//            rst.close();
//            if (stmt != null) {
//                stmt.close();
//            }
//            if (this.con != null && this.con.getAutoCommit()) {
//                this.con.close();
//            }
//        }
//

此段代码可以顺利的无异常的执行。由此我推测认为,主要是因为 resultset ,connection关闭引起的。这说明,在执行了查询操作之后,
我们虽然可以得到一个blob对象,但是实际的内容并没有读如内存,也就是说,并没有读如到blob对象中,而此blob对象也就相当于一个对数据库中blob字段操作的一个引用,所以,此时,如果想从blob字段中读取数据,还是需要数据库连接的。

而上面的封装操作之后,数据库连接已经中断,所以,再读取数据时,就发生了异常。


下面是Blob接口的说明,也许能给我们更好的解释.

public interface Blob

SQL BLOB 值在 JavaTM 编程语言中的表示形式(映射关系)。SQL BLOB 是内置类型,它将 Binary Large Object 存储为数据库表的某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(BLOB) 实现 Blob,这意味着 Blob 对象包含一个指向 SQL BLOB 数据而不是数据本身的逻辑指针。Blob 对象在它被创建的事务处理期间有效。

接口 ResultSetCallableStatementPreparedStatement 中的方法(如 getBlobsetBlob)允许编程人员访问 SQL BLOB 值。Blob 接口提供某些方法来获得 SQL BLOB (Binary Large Object) 值的长度、在客户端实现 BLOB 值以及确定 BLOB 值中某一字节样本的位置。此外,此接口还拥有更新 BLOB 值的方法。

分享到:
评论

相关推荐

    C#,BLOB读取操作

    C# 中的 BLOB 读取操作 C# 中的 BLOB(Binary Large OBject)读取操作是指从数据库中读取二进制数据的过程。BLOB 是一种二进制数据类型,用于存储大规模的二进制数据,如图片、音频、视频等。在 C# 中,我们可以...

    jdbc 操作oracle blob数据

    jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc 操作oracle blob数据jdbc ...

    JAVA操作Oracle blob类型

    这篇博客文章“JAVA操作Oracle blob类型”将深入探讨如何在Java应用程序中有效地管理和操作Oracle数据库中的BLOB字段。本文将详细讲解相关知识点,包括连接数据库、插入BLOB数据、查询BLOB数据以及更新和删除BLOB...

    QT-Mysql-Blob.zip_mysql blob_qt blob 文件_qt blob类型_qt的blob

    // 提交事务并关闭数据库连接 db.commit(); db.close(); ``` 在读取BLOB数据时,你可以使用QSqlQuery的`next()`方法来遍历结果集,然后通过`value()`函数获取BLOB字段对应的QByteArray。你可以将其写入文件,或者以...

    Python如何操作Oracle的Blob字段

    Python如何操作Oracle的Blob字段,

    jsp操作mysql数据库的blob字段

    - **关闭资源**:操作完成后,记得关闭数据库连接、输入/输出流等资源,防止内存泄漏和资源浪费。 - **事务管理**:对于多个数据库操作,考虑使用事务以确保数据一致性。 - **错误处理**:添加异常处理代码,捕获...

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    在Java编程中,Blob(Binary Large Object)是用于存储大量二进制数据的数据类型,常被用在数据库中保存图片...在实际开发中,根据具体需求,可能还需要处理异常、事务管理和资源关闭等问题,确保程序的健壮性和效率。

    在PowerBuilder中操作BLOB数据的技巧

    在操作 BLOB 字段时,我们需要在操作系统的 ODBC 配置中建立指向数据库的连接,名称定为 bmptable。然后,我们可以使用 SQL 语句来实现数据库的连接、图片的插入、更新、删除和查询。 在以下程序片段中,我们将实现...

    c#操作oracle数据库Blob源码

    在完成操作后,别忘了关闭数据库连接: ```csharp conn.Close(); ``` 以上就是使用C#操作Oracle数据库Blob字段的基本步骤,包括插入和更新操作。在实际应用中,可能还需要考虑异常处理、事务管理等更复杂的细节。...

    SSH示例代码(带事物和Blob操作的)

    在DAO层,可能会有专门的方法来处理Blob对象的读写操作,例如使用Session的saveOrUpdate()方法保存包含Blob的数据,使用Blob的setBinaryStream()和getBinaryStream()方法进行读写操作。 项目中的单元测试是保证代码...

    java读取大字段blob类型

    8. **异常处理**:在实际操作过程中,可能会出现各种异常情况,如数据库连接失败、查询错误等,需要通过异常处理机制来捕获并妥善处理这些异常。 ```java catch (Exception ex) { System.out.println("异常:" + ...

    blob.zip_blob_blob detection

    7. **连通成分分析**:最后,通过连通组件分析将角点连接起来,形成Blob。 在“code”目录中,可能包含实现上述步骤的代码,而"data"目录可能包含测试图像或预处理好的数据,用于运行Blob检测算法。通过分析和理解...

    java file upload BLOB

    - 最后,执行插入操作,并关闭数据库连接。 #### 注意事项: - 在处理 BLOB 数据时,需要注意资源管理,确保所有打开的输入输出流和数据库连接都被正确关闭。 - 当使用 Oracle 数据库时,需要引入 Oracle 的 JDBC ...

    使用JDBC4.0操作Oracle中BLOB类型的数据方法

    在实际应用中,确保正确处理异常并关闭所有的流和数据库连接,以避免资源泄漏。此外,`DBHelper`是你自定义的数据库操作类,可能包含了连接池和SQL执行的相关逻辑。 通过上述步骤,你就能在JDBC4.0环境中有效地使用...

    Hibernate对BLOB CLOB操作

    下面我们将深入探讨Hibernate对BLOB和CLOB的操作。 首先,我们来看一下如何在数据库中创建包含BLOB和CLOB字段的表。例如,以下SQL语句创建了一个名为`users`的表,其中`uids`为主键,`img`为BLOB类型,`txt`为CLOB...

    sql server字段保存文件,blob操作

    在SQL Server中操作BLOB字段通常涉及以下步骤: 1. **创建表结构**:首先,你需要在数据库中创建一个包含`varbinary(MAX)`字段的表。例如: ```sql CREATE TABLE FilesTable ( ID INT PRIMARY KEY, FileName ...

    oracle blob转文件读取

    - 在处理大型Blob数据时,需要注意内存使用情况,避免因内存不足导致的问题。 - 为了提高性能,可以考虑使用流式处理方式来读取和写入Blob数据。 - 安全性方面,需要确保连接字符串的安全性和数据库访问权限的适当...

    blob 文件入库例子

    7. **关闭连接**:完成操作后,确保关闭数据库连接和相关的流资源,防止资源泄露。 这些Java源代码例子对于初学者来说是很好的学习资源,可以帮助理解如何在实际项目中处理Blob类型的数据。在开发过程中,需要注意...

    Hibernate对Blob,Clob的操作

    值得注意的是,Blob和Clob对象通常占用大量内存,因此在读取数据后应尽快关闭流资源,以避免内存溢出。 另外,由于Blob和Clob可能会占用大量磁盘空间,所以在设计数据库表结构时,要考虑存储效率和查询性能,可能...

    Blob.js-master Blob js 插件,有时候IE不支持Blob,需要我们自己下载Blob插件,有需要小伙伴可以下载

    2. 使用Blob.js提供的函数创建、操作Blob对象。 3. 使用URL.createObjectURL和 revokeObjectURL管理Blob URL,确保内存资源的有效释放。 4. 处理完Blob数据后,记得销毁不再使用的Blob对象,以防止内存泄漏。 总的...

Global site tag (gtag.js) - Google Analytics