`
fengzl
  • 浏览: 215641 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

blob、clob字段小结(-)

阅读更多
这种大容量字段有何用,也许大部分人马上联想到用来存储图片、文章,不过俺确是用它来存储Java串行化对象,当时用Swing做了个绘图工具,为了数据集中管理决定把图纸内容存到数据库,大家可以想象如果不用blob类型的字段,那表该如何设计呢?图元的种类N多,每个种类的属性N多,而且种类和属性都会变化,再加上还有图层的关系,最重要的一点就是存储速度(这个问题稍候我会解释)问题,要想设计出能完美解决以上问题的表结构将是想当困难的事,在项目进度的压力下对于两年前刚刚摆脱强大然而设计模式恶心的MFC,正投奔Java正营,边学语言边“设计”绘图工具的我,唯一能想到的而且最终证明在项目中成功实施的就是blob 字段了,当然blob字段不是万能药,所有信息都存在blob中将导致你的数据无法利用SQL的查询、过滤、统计等功能,所以对应重要的字段还是有必要把他们“拉”出来的,看看以下的表结构,你就明白了:
/////////////////////
// 图纸
/////////////////////
create table EMHOOKUP
(
  PICID       NUMBER(8) not null,
  PICNAME     VARCHAR2(100) not null,
  PICTUREDATA BLOB,
  PICTYPE     NUMBER(8),
  PICMODIFYID NUMBER(8)
)
alter table EMHOOKUP add primary key (PICID)


下面让我们来研究一下,如果在Oracle数据库中进行实际的存储

        DBTemplate db = new DBTemplate() {
            public void dbProcess(Connection con) throws Exception {
                StringBuffer sql = new StringBuffer();
                sql.append(" insert into emhookup ");
                sql.append(" (picid, picname, picmodifyid, picturedata, pictype)values ");
                sql.append(" (?, ?, picmodifyidseq.nextval, EMPTY_BLOB(), ?)");

                PreparedStatement ps = con.prepareStatement(sql.toString());
                ps.setInt(1, picID);
                ps.setString(2, picName);
                ps.setInt(3, data.picType);
                ps.executeUpdate();
                ps.close();

                sql.setLength(0);
                sql.append(" select picturedata from emhookup ");
                sql.append(" where picid=? for update ");
                ps = con.prepareStatement(sql.toString());
                ps.setInt(1, picID);
                ResultSet rs = ps.executeQuery();
                if (rs.next()) {
                    oracle.sql.BLOB blob = (oracle.sql.BLOB) rs.getBlob("picturedata");
                    ObjectOutputStream out = new ObjectOutputStream(blob.getBinaryOutputStream());
                    out.writeObject(DataProcess.toByteByGZIP(data));
                    out.flush();
                    out.close();
                }
                rs.close();
                ps.close();
            }
        };
        db.runWithTransaction(); 


从以上代码可知oracle中的blob/clob都需要先插入空数据empty_blob()/empty_clob()然后再锁定该行 for update 进行更新,并且必须在事务中运行runWithTransaction 。
分享到:
评论

相关推荐

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

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

    关于Clob类型在Hibernate中 的应用小结-- 一篇使用心得.zip

    3. **插入与更新**:当向数据库中插入或更新包含Clob字段的记录时,Hibernate会自动处理这些数据。可以使用`session.save()`或`session.update()`方法,但在实际使用中,我们通常需要使用`session.merge()`,因为它...

    关于Clob类型在Hibernate中 的应用小结

    在Hibernate的XML映射文件中,你需要为这个Clob字段指定映射规则,例如: ```xml <column name="SUMMARY_CLOB" /> ``` **CRUD操作**: 4.2.1 **创建(Create)**: 在创建新记录时,你需要将待存入的文本...

    关于Clob类型在Hibernate中 的应用小结.rar

    通常,要解决超过4000字节的数据,一种做法是将数据写入文件,xml或plain file都可以,数据...另一个做法是使用clob, blob等字段类型,主要有:采用传统的jbdc方式、把clob以string方式处理、直接使用clob类型三种方案

    MySQL 建表的优化策略 小结

    - **BLOB和CLOB**:这些大对象类型不宜建立索引,因为它们对性能影响较大,且索引效果不佳。 6. **特殊优化策略**: - **表格分割**:通过分区或分表,将大表拆分成更小的部分,以分散I/O负载,提高查询效率。 -...

    EJB3.0注释小结

    6. **@Lob** 和 **@Basic(fetch=FetchType.LAZY)**:结合使用表示字段是大对象(LOB,如Clob或Blob),并且以懒加载的方式获取。 7. **@PersistenceContext**:在SessionBean中注入EntityManager,以管理实体的生命...

    Java数据库编程宝典2

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典4

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典1

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    Java数据库编程宝典3

    1.6 小结 第2章 设计数据库 2.1 数据库设计应考虑的事项 2.1.1 项目规范 2.1.2 设计表 2.1.3 生成发票 2.2 引用完整性 2.2.1 通用完整性规则 2.2.2 特定于数据库的完整性规则 2.3 小结 第3章 SQL基础 ...

    数据库建表语句

    ### 五、小结 数据库建表语句是数据库设计与管理的基础,尤其是在Oracle这样的关系型数据库管理系统中。通过理解和掌握正确的建表语法,可以有效地创建满足业务需求的数据库表,进而提升数据处理的效率和准确性。在...

    ORACLE设计表时

    ### 小结 综上所述,在设计Oracle表时,针对不同数据类型,应根据实际需求选择合适的类型和长度。对于Integer类型,可以根据数据范围选择NUMBER或INTEGER;Long类型已被废弃,建议使用CLOB或BLOB替代;Date类型则...

    hibernate annotation学习文档

    #### 五、小结 通过上述示例,我们了解了如何使用 Hibernate 注解来快速实现 Java 对象与数据库表之间的映射。这些注解大大简化了实体类的定义,同时也提供了足够的灵活性来处理复杂的业务需求。对于初学者而言,...

    Spring中文帮助文档

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

    Spring API

    14.5.2. 小结 14.6. 文档视图(PDF/Excel) 14.6.1. 简介 14.6.2. 配置和安装 14.7. JasperReports 14.7.1. 依赖的资源 14.7.2. 配置 14.7.3. 构造ModelAndView 14.7.4. 使用子报表 14.7.5. 配置Exporter的...

Global site tag (gtag.js) - Google Analytics