文档章节

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

李茂冉
 李茂冉
发布于 2016/05/17 03:32
字数 424
阅读 94
收藏 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
请教各位大神:把java中int类型的数据插入oracle中SMALLINT(java中对应short)对应的字段的时候,需要在java中对int进行转换吗?

请教各位大神:把java中int类型的数据插入oracle中SMALLINT(java中对应short)对应的字段的时候,需要在java中对int进行转换吗?

梅飞雪舞
2016/03/08
472
3
使用java 如何将oracle 的数据迁移到Hive 上?

如题:使用java 如何将oracle 的数据迁移到Hive 上? 自己准备 先用jdbc 将oracle 的数据先导出成文本, 根据hive 规则创建表 在jdbc 上执行hive load data 语句进行导入。 想请问大神,这种...

D大调协奏曲
2016/12/01
416
1

没有更多内容

加载失败,请刷新页面

加载更多

局域网共享文件读写的实现方式

首先是设置共享目录,支持用户和密码等权限控制 然后我们可以使用Windows资源管理器操作共享目录下的文件 这中间隐藏了资源管理器帮我们建立目录映射和连接的过程,如果设置了用户名和密码,...

夏至如沫
17分钟前
2
0
Elasticsearch安装与配置

一、Docker安装ES 开发模式 可以使用以下命令快速启动Elasticsearch以进行开发或测试: $ docker run -p 9200:9200 -p 9300:9300 -d --name es -e "discovery.type=single-node" docker.ela...

吴伟祥
23分钟前
1
0
移动页面滚动穿透解决方案(荐)

移动页面滚动穿透解决方法目前有多种解决方案,我介绍下几种方案: 解决方案1:阻止冒泡。 //关键代码$(".sliders,.modals").on("touchmove",function(event){    event.preventDefau...

壹峰
24分钟前
0
0
调用infura实现java项目调用智能合约

https://infura.io/dashboard 注册一个帐号 添加一个project 可选择主网或者其他网络,然后复制地址放进pom.xml中 复制智能合约地址复制到pom.xml中 复制任意一个帐号的private key到pom.xml...

八戒八戒八戒
31分钟前
3
0
vue+koa2+token 登录验证

https://segmentfault.com/a/1190000017379244?utm_source=weekly&utm_medium=email&utm_campaign=email_weekly...

Js_Mei
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部