`

Oracle 的Blob使用小结

    博客分类:
  • J2EE
阅读更多

Oracle 的Blob

Oracle的Lobs的流处理方式与Long等对象的Stream方式不一样,没有Long的诸多限制;只要保持连接,就能通过blob对象正确读取对象。
有两种方式可以读取Blob:
1.直接使用ps.getBinaryStream()的方法得到流对象
2.使用getBlob得到blob,然后通过blob的方法提供的getBinaryStream(),getBytes() 访问blob的数据。
这两种方法都可以在rs.close之后正确获取数据。(在spring 的JdbcTemplet环境下,该rs理论上被JdbcTemplet自动关闭;从数据库连接来看,连接也正确关闭了)。

使用Blob的好处是,按需获取Blob对象。而且可以多次通过blob.getBinaryStream得到对象。且Blob返回的对象可以使用mark/reset方法反复访问。且连接状态正常。
使用blob得到InputStream,可以调用close()接口,也可以不调用该接口,在连接关闭时将自动关闭该连接。最好调用close()释放资源。

c3p0的setBlob(pos,InputStream)接口不能正常工作。

写入或更新Blob时,可以使用ps.setBinaryStream();调用此接口后,in对象到文件尾(在把stream写入blob后,不能要再调用in.close()关闭文件,否则报错)。
也可以使用setBlob(pos,Blob)方法来写入或更新Blob字段;但是注意的是,无论是以blob还是blob.getBinaryStream的方式,都不能自己更新自己,否则死锁。

使用spring读取blob的示例程序:
            String sql = "select photo from my_photoes where id='test2' and photo is not null and rownum<2 ";
BLOB blob= (BLOB) simpleDao.queryForObject(sql,Blob.class);       
InputStream in = blob.getBinaryStream();
String filename = "./test/dao/pic" + 1+ ".gif";
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));

            /* 需oracle的BLOB支持。效率可能会高些,但是空间上会有些浪费
byte[] b = new byte[blob.getBufferSize()];                //blob必须为oracle.sql.BLOB时才可调getBufferSize方法; 与java.sql.Blob区别。
System.out.println("bufferSize="+b.length);            //32k左右,用这种方式读取文件会有一点空间的浪费。
int len=-1;
while ((len = in.read(b)) != -1) {
out.write(b);
}
            */

            /*   纯jdbc方法:
                nt b;
     while ((b = in.read()) != -1) {
    out.write(b);
     }
            */

in.close();
out.close();


BLOB处理遇到的问题:
1.用spring的模板类来处理blob时,遇到大文件时,流会异常关闭。解决办法,使用oracle的本地连接来获取blob流,如下:
    public boolean queryForBlobStream(String sql,OutputStream fout)
    {
        boolean flag=true;
        try {
            Connection conn = DataSourceUtils.getConnection(getJdbcTemplate().getDataSource());
            conn.setAutoCommit(false);                        //此部分ms能提高性能
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(sql);
            if (rs.next()) {
                java.sql.Blob blob = rs.getBlob(1);
                InputStream ins = blob.getBinaryStream();
                //输出到文件
                //下面将BLOB数据写入文件
                byte[] b = new byte[1024];
                int len = 0;
                while ((len = ins.read(b)) != -1) {
                    fout.write(b, 0, len);
                }
                //依次关闭
                fout.close();
                ins.close();
            }
            conn.commit();
            rs.close();             //maybe not nessesary
            st.close();             //maybe not nessesary
            conn.close();
        } catch (IOException ex) {
            flag=false;
        } catch (SQLException ex) {
            flag=false;
        }
        return flag;
    }
2.如果把blob对象放到记录的字段中,在web开发中,通过blob.getBinaryStream()只能获得一次blob流,第二次调用同一对象的blob流会得到null流。
且在这种方式下,不能使用in.close()关闭流。
分享到:
评论
1 楼 sysutyphoon 2010-06-02  
ResultSet  能通过getString(index)  处理BLOB么?不能的话是抛异常还是返回null?

相关推荐

    oracle中的BLOB(照片)转换到mysql中

    总结来说,从Oracle的BLOB类型字段中提取并转换到MySQL的过程涉及到查询、导出、上传等多个步骤。在实际操作中,需要对数据库API有深入理解,并注意数据的兼容性和性能优化。通过以上方法,你可以顺利地在两个数据库...

    Oracle blob字段上传下载

    ### Oracle Blob字段上传与下载详解 #### 一、概述 在数据库系统中,二进制大对象(Binary Large Object,简称BLOB)是一种用于存储大量二进制数据的数据类型,例如图像、音频或视频文件等。Oracle数据库支持Blob...

    java中读取ORACLE中BLOB字段存储的图片

    ### Java中读取Oracle数据库BLOB字段存储的图片方法详解 #### 一、背景与目的 在实际的应用开发过程中,经常会有将图片等二进制数据存入数据库的需求。Oracle数据库支持通过BLOB(Binary Large Object)类型来存储...

    spring oracle blob

    根据提供的标题、描述以及部分代码内容,我们可以整理出关于如何在Spring框架中处理Oracle数据库中的BLOB类型数据的相关知识点。 ### 一、BLOB类型简介 BLOB(Binary Large Object)是二进制大对象的缩写,通常...

    oracle中读取blob字段.doc

    在Oracle SQL中,可以使用`empty_blob()`函数创建一个空的BLOB对象。 ```java // 获取一个空的BLOB对象 oracle.sql.BLOB emptyBlob = (oracle.sql.BLOB) conn.createBlob(); ``` ##### 4.3 设置BLOB数据 接下来...

    mysql oracle 插入blob数据实例源码

    总结来说,MySQL和Oracle都提供了插入Blob数据的能力,但具体的实现细节因数据库系统而异。在实际开发中,你需要根据所使用的数据库系统选择合适的API和方法来处理Blob数据。提供的源码示例可作为参考,根据实际情况...

    深入浅析mybatis oracle BLOB类型字段保存与读取

    总结起来,MyBatis与Oracle结合处理BLOB字段时,关键步骤包括:正确设置数据库表结构,创建相应的Java实体类,以及编写MyBatis映射文件来定义SQL查询和操作。理解这些概念和操作,能帮助你在实际开发中更有效地管理...

    oracle_java_blob

    总结,通过上述步骤,我们成功地利用Java将MP3文件存储到Oracle数据库的BLOB字段,并能够从中检索出来。这个过程涉及到数据库连接、SQL操作、文件I/O以及BLOB数据类型的处理。在实际应用中,需要考虑异常处理、事务...

    JDBC操纵Oracle数据库中的BLOB字段

    总结而言,使用JDBC操纵Oracle数据库中的BLOB字段,无论是通过现代的`setBinaryStream`方法还是古老的分步写入策略,都能有效实现对多媒体数据的高效管理。开发者应根据具体的应用需求和环境选择最合适的操作方式。

    Java存取OracleBlob字段,图片存储,Blob和BLOB的问题,Clob,oracle.docx

    在使用 Java 进行 Oracle 数据库操作时,理解 Blob 和 Clob 类型及其操作方法至关重要。通过合理选择 JDBC 版本和适配容器特性,可以有效地管理大容量数据,提高应用程序的性能和稳定性。此外,还需要关注不同容器...

    sql server中的image类型的数据导出到oracle的clob字段中

    为了将 SQL Server 中的 Image 类型数据导出到 Oracle 的 CLOB 字段中,我们需要使用Java 语言和 JDBC 驱动程序。下面是一个示例代码,演示如何将 SQL Server 中的 Image 类型数据导出到 Oracle 的 CLOB 字段中: ...

    mysql和Oracle在对clob和blob字段的处理

    总结来说,MySQL和Oracle在处理`CLOB`和`BLOB`字段时都有其独特的方法和优缺点。理解这些差异对于开发和维护高效、可扩展的数据库系统至关重要。实际应用中,开发者应根据具体业务需求和性能指标,选择合适的数据...

    使用JDBC和Hibernate来写入Blob型数据到Oracle中

    总结一下,处理Oracle数据库中的Blob数据,你可以选择使用原生的JDBC,这更底层,适合对数据库操作有更多控制的需求。而Hibernate提供了一种更高级、面向对象的方式,简化了数据库操作,但可能带来额外的学习成本。...

    Oracle clob和blob在jdbc的应用

    总结来说,Oracle数据库中的CLOB和BLOB类型是处理大量文本和二进制数据的关键。在JDBC中,我们可以通过`PreparedStatement`进行高效且安全的插入、更新和查询操作。理解如何正确地使用这些数据类型和相关的JDBC方法...

    Hibernate操作Oarcle中Clob、Blob字段小结

    这篇博客文章“Hibernate操作Oracle中Clob、Blob字段小结”可能会探讨如何在Hibernate中有效地处理这两种类型的数据。 1. **Clob与Blob的理解**: - Clob:Clob是用于存储大量字符数据的类型,例如长篇文章、XML...

    oracle触发器实现二维码

    总结起来,这个项目实现了将Java生成的二维码图片通过Oracle触发器转换为BLOB,并存储到数据库表中,这在需要在数据库中存储和检索二维码图像的场景下非常有用。同时,这也展示了Java和Oracle数据库的集成能力,以及...

    在VC6中使用ADO读取Oracle中的BLOB字段

    ### 在VC6中使用ADO读取Oracle中的BLOB字段 #### 概述 在软件开发过程中,经常需要处理数据库中的二进制大对象(BLOB)字段,如图像、音频或视频文件等。本文将详细介绍如何在Visual C++ 6.0(VC6)环境下使用...

    jQuery缩略图和blob的jsp代码

    在IT行业中,jQuery、Oracle Blob、JSP以及图片处理是常见的技术领域,这些技术常常结合在一起用于构建功能丰富的Web应用程序,特别是涉及到图像上传和显示的场景。以下是对这些知识点的详细说明: 首先,jQuery是...

    java file upload BLOB

    - 当使用 Oracle 数据库时,需要引入 Oracle 的 JDBC 驱动,并且在处理 BLOB 对象时需要导入 `oracle.sql.BLOB` 类。 - 为了提高效率和安全性,可以考虑使用事务来保证数据的一致性。 ### 2. 处理图片上传和显示的...

Global site tag (gtag.js) - Google Analytics