文档章节

java Oracle中的大字段存二进制/大文本

李茂冉
 李茂冉
发布于 2016/05/17 03:32
字数 424
阅读 91
收藏 6

###数据库中提供了两种字段类型 Blob 和 Clob 用于存储大型字符串或二进制数据

  • Blob 采用单字节存储,适合保存二进制数据,如图片文件。
  • Clob 采用多字节存储,适合保存大型文本数据。

###Oracle中处理BLOB/CLOB字段的方式比较特别,所以需要特别注意下面两点:

  1. 在Oracle JDBC中采用流机制对 BLOB/CLOB 进行读写操作,所以要注意不能在批处理中读写 BLOB/CLOB字段,否则将出现 Stream type cannot be used in batching 异常。
  2. Oracle BLOB/CLOB 字段本身拥有一个游标(cursor),JDBC通过游标对Blob/Clob字段进行操作,在Blob/Clob字段创建之前,无法获取其游标句柄,会出现 Connection reset by peer: socket write error 异常。

正确的做法是:首先创建一个空 Blob/Clob 字段,再从这个空 Blob/Clob字段获取游标,例如下面的代码:

PreparedStatement ps = conn.prepareStatement( " insert into PICTURE(image,resume) values(?,?) " );
// 通过oralce.sql.BLOB/CLOB.empty_lob()构造空Blob/Clob对象 
ps.setBlob( 1 ,oracle.sql.BLOB.empty_lob());
ps.setClob( 2 ,oracle.sql.CLOB.empty_lob());
ps.excuteUpdate();
ps.close();
// 再次对读出Blob/Clob句柄 
ps = conn.prepareStatement( " select image,resume from PICTURE where id=? for update " );
ps.setInt( 1 , 100 );
ResultSet rs = ps.executeQuery();
rs.next();
oracle.sql.BLOB imgBlob = (oracle.sql.BLOB)rs.getBlob( 1 );
oracle.sql.CLOB resClob = (oracle.sql.CLOB)rs.getClob( 2 );
// 将二进制数据写入Blob 
FileInputStream inStream =   new FileInputStream( " c://image.jpg " );
OutputStream outStream = imgBlob.getBinaryOutputStream();
byte [] buf =   new   byte [ 10240 ];
int len;
while (len = inStream.read(buf) > 0 ) {
outStream.write(buf, 0 ,len);
} 
inStream.close();
outStream.cloese();
// 将字符串写入Clob 
resClob.putString( 1 , " this is a clob " );
//db save over
//此时已经完成操作。下面步骤不用也可以!
// 再将Blob/Clob字段更新到数据库 
ps = conn.prepareStatement( " update PICTURE set image=? and resume=? where id=? " );
ps.setBlob( 1 ,imgBlob);
ps.setClob( 2 ,resClob);
ps.setInt( 3 , 100 );
ps.executeUpdate();
ps.close();

© 著作权归作者所有

共有 人打赏支持
李茂冉
粉丝 5
博文 103
码字总数 59256
作品 0
东城
高级程序员
Clob,Blob,InputStream,byte 互转

今天用java读取oracle里的Clob字段。本来要转成xml文件的,一顿转换。现在总结一下这个流的互相转换方法。 以下内容来自:http://hi.baidu.com/webidea/item/8965fd99de1034dd1e4271e1 一、b...

王小明123
2012/10/06
0
1
Java大对象类型的Hibernate映射

在Java中,java.lang.String可用于表示长字符串(长度超过255),字节数组byte[]可以用于存放图片户或文件二进制数据。此外,在JDBC API中还提供了java.sql.CLOB和java.sql.BLOB类型,他们分...

frabbit
2013/05/07
0
0
基于AEAI ESB的处理大字段

1.背景 数据迁移中大字段一直是个比较头疼的问题,一旦大字段中值大于32K的话就无法用sql语句来实现插入和更新。通用的解决办法一般有两种:存储过程和JDBC。下面主要总结下基于AEAI ESB用J...

数通畅联
2015/01/22
0
0
Ehcache和MemCached比较分析

项目 Memcache Ehcache 分布式 不完全,集群默认不实现 支持 集群 可通过客户端实现 支持(默认是异步同步) 持久化 可通过第三方应用实现,如sina研发的memcachedb,将cache的数据保存到[ur...

浮躁的码农
2015/07/24
0
0
集算器实现计算路由优化BI后台性能

问题的提出 BI系统的常见结构是:前端是BI应用,负责多维分析的用户操作和结果呈现;后台是数据库/数据仓库,负责数据计算和存储。前端和后台之间用SQL作为接口。 实际应用中,常常出现后台数...

润乾软件
08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

软件测试工具书籍与面试题汇总下载(持续更新)

简介 本文是https://github.com/china-testing/python-api-tesing/blob/master/books.md 的节选。 欢迎转载,转载请附带此简介,谢谢! 试题 软件测试综合面试题(高级测试)-试题.pdf 软件测试...

python测试开发人工智能安全
13分钟前
0
0
java.sql.SQLException: Io 异常: The Network Adapter could not establish the connection 解决

有个项目使用的log4j进行日志记录的,同时也是用log4j中的数据库配置直接把相应级别的日志直接插入oracle。 在把项目部署的另一个内网环境时候,把项目的其他配置都改了,唯独log4j中的数据库...

哥本哈根的小哥
23分钟前
0
0
耗时 2 年,用 8.5 万块乐高积木最牛复刻 Apple Park

简评:国外大佬复刻 Apple Park,看了一下细节,确实厉害!只有你想不到,没有乐高拼不起来的,有没有乐高大神挑战一下? 苹果公园以各种各样的方式鼓舞人心,让人感兴趣。从建筑、可持续性和...

极光推送
24分钟前
0
0
记一次查找Hdfs磁盘占用空间比实际存储文件大4倍的原因

在一次主备namenode发生切换后,重启datanode节点,发现磁盘空间很大,想清理一下磁盘, 通过命令Hdfs dfs -du -h --max-depth=1 / 发现实际文件的大小只有8g,通过du -h --max-depth=1 /ha...

PageYi
51分钟前
4
0
阿里云推荐引擎使用教程

产品概述: 推荐引擎(Recommendation Engine,以下简称RecEng,特指阿里云推荐引擎)是在阿里云计算环境下建立的一套推荐服务框架,目标是让广大中小互联网企业能够在这套框架上快速的搭建满...

mcy0425
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部