- 浏览: 273735 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
86614009:
如何在service层,如何获取绑定到当前线程的entitna ...
使用spring的OpenEntityManagerInView -
yajunyajun2011:
好帖子 怎么没人顶呢
Java 正则表达式最大,最小匹配问题 -
xtuali:
能说明一下,你的nutch是哪个版本的吗?谢谢!
搜索引擎Nutch源代码研究之一 网页抓取(1) -
dongmusic:
需要学习这么多的东西,吐血中...
如何提高Java开发能力 -
jiminsc:
cool
LDAP 验证、添加、修改、删除(转)
文章分类:Java编程
Clob和blob的操作主要分为3种:插入,更新和读取显示。
对于插入,可以分为两类。一类是可以直接按照正常的字段处理,一类为必须先插入空clob/blob再更新为真正的内容。
插入:
对于大部分的数据库,在插入lob时都可以通过PreparedStatement.setAsciiStream或PreparedStatement.setBinaryStream直接写入,查到的资料包括:
H2数据库:http://code.google.com/p/h2database/issues/detail?id=100#c3
Mysql数据库:http://lavasoft.blog.51cto.com/62575/64963
DB2:http://lavasoft.blog.51cto.com/62575/64683
而对于Oracle数据库则必须先插入空lob,重新查询再进行更新(查询时需要加for update)。方法如下:
Oracle数据库:http://www.iteye.com/topic/254
插入空Lob的方式很多,如可以插入长度为1的byte[1到blob中]或1个字符的字符串到clob中。也可以在创建表时通过default empty_clob()由数据库自动创建。
对于上面帖子的补充:robbin同志介绍说需要加for update行锁,是为了防止被其他连接并发更新,这种提法并不完整。oracle数据库要求进行lob更新时,必须加for update,否则报错,这是数据库一个强制要求。就算你知道不会有并发修改,也必须加。
对于Lob更新,方法都比较类似,查询到Lob字段然后直接更新(H2不支持Lob字段的更新)。需要注意的是,获取到Lob的Stream(如:Blob.setBinaryStream())写入完毕后,必须调用flush(),否则可能会出现数据丢失(在Oracle10g + odbc14.jar下测试发现)。
对于Lob读取:可以使用传统的java.sql.Clob/java.sql.Blob的api,某些驱动也可以使用rs.getString()或rs.getBytes()(没有测试过,据说大部分都行)当成普通的varchar和字节字段处理,很是方便。
对于Clob/Blob的使用,大部分都纠结在Oracle上,Oracle有各种各样的限制,如经典的长度限制,最新的odbc14.jar驱动据说已经解决了所有问题,也就是增加一个连接参数SetBigStringTryClob的事情。相关的资料如下:
Oracle官方文档:
http://www.oracle.com/technology/sample_code/tech/java/codesnippet/jdbc/clob10g/handlingclobsinoraclejdbc10g.html
也可以看看一大堆跟贴的讨论:
http://www.iteye.com/topic/254
我没有测试过rs.getString()的方法,我测试过Oracle和H2的Clob api。通过clob api的方法,可以正常的写入和读取100万字符的大字符串。最理想,最节省内存,也最通用的应该还是JDBC为Lob设计的api。
NAME varchar(24) DEFAULT NULL,
TXT text,
IMG blob
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
import java.sql.*;
import java.io.*;
/**
* JDBC 读取MySQL lob字段测试
* File: TestLob4MySQL.java
* User: leizhimin
* Date: 2008-3-3 14:44:30
*/
public class TestLob4MySQL {
public static final String url = "jdbc:mysql://localhost/testdb";
public static final String username = "root";
public static final String password = "leizhimin";
public static final String driverClassName = "com.mysql.jdbc.Driver";
/**
* 数据库连接获取器
*
* @return 数据库连接
*/
public static Connection makeConnection() {
Connection conn = null;
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 测试数据库连接
*/
public static void testConnection() {
Connection conn = makeConnection();
try {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM mysql.user");
while (rs.next()) {
String s1 = rs.getString(1);
System.out.println(s1);
}
rs.close();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 插入Lob字段
*/
public static void testInsertlob() {
Connection conn = makeConnection();
try {
conn.setAutoCommit(false);
File txtFile = new File("C:\\txt.txt");
File imgFile = new File("C:\\img.png");
int txt_len = (int) txtFile.length();
int img_len = (int) imgFile.length();
try {
InputStream fis1 = new FileInputStream(txtFile);
InputStream fis2 = new FileInputStream(imgFile);
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO T_LOB(NAME,TXT,IMG) VALUES('G',?,?)");
pstmt.setAsciiStream(1, fis1, txt_len);
pstmt.setBinaryStream(2, fis2, img_len);
pstmt.executeUpdate();
conn.commit();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 读取lob字段
*/
public static void testQueryLob() {
Connection conn = makeConnection();
try {
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT TXT,IMG FROM T_LOB");
int i = 1;
while (rs.next()) {
Clob clob = rs.getClob("TXT");
Blob blob = rs.getBlob("IMG");
InputStream txtIs = rs.getAsciiStream("TXT");
InputStream imgIs = rs.getBinaryStream("IMG");
InputStreamReader txtIsr = new InputStreamReader(txtIs);
InputStreamReader imgIsr = new InputStreamReader(imgIs);
BufferedReader buff_txtIsr = new BufferedReader(txtIsr);
BufferedReader buff_imgIsr = new BufferedReader(imgIsr);
String line = null;
while (null != (line = buff_txtIsr.readLine())) {
System.out.println(line); //将其输出至屏幕,实际你可以按照需要处理
}
File fileOutput = new File("c:\\img_x" + i + ".png");
FileOutputStream fo = new FileOutputStream(fileOutput);
int c;
while ((c = imgIs.read()) != -1)
fo.write(c);
fo.close();
System.out.println("img " + i + " retrieved!");
i++;
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 读取lob字段
*/
public static void testQueryLob1() {
Connection conn = makeConnection();
try {
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT TXT,IMG FROM T_LOB");
while (rs.next()) {
Clob clob = rs.getClob("TXT");
Blob blob = rs.getBlob("IMG");
InputStream txtIs = clob.getAsciiStream();
InputStream imgIs = blob.getBinaryStream();
InputStreamReader txtIsr = new InputStreamReader(txtIs);
InputStreamReader imgIsr = new InputStreamReader(imgIs);
BufferedReader buff_txtIsr = new BufferedReader(txtIsr);
BufferedReader buff_imgIsr = new BufferedReader(imgIsr);
String line = null;
while (null != (line = buff_txtIsr.readLine())) {
System.out.println(line); //将其输出至屏幕,实际你可以按照需要处理
}
}
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 删除lob字段
*/
public static void testDeleteLob() {
Connection conn = makeConnection();
try {
conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
int row = stmt.executeUpdate("DELETE FROM T_LOB");
conn.commit();
System.out.println("删除 " + row + " 行数据!");
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 读取lob字段
*/
public static void testUpdateLob() {
Connection conn = makeConnection();
try {
String in_str="HAHAHAHAHAHA!!!";
File in_file=new File("c:\\img_haha.png");
InputStream txt_is = string2InputStream(in_str);
InputStream img_is =new FileInputStream(in_file);
conn.setAutoCommit(false);
PreparedStatement pstmt = conn.prepareStatement("UPDATE T_LOB SET TXT=?, IMG=? WHERE NAME='G'");
pstmt.setAsciiStream(1,txt_is,in_str.getBytes().length);
pstmt.setBinaryStream(2,img_is,(int)in_file.length());
int row = pstmt.executeUpdate();
conn.commit();
txt_is.close();
img_is.close();
// System.out.println("更新 " + row + " 行数据!");
} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} finally {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String args[]) {
// testInsertlob();
// testQueryLob();
// testQueryLob1();
// testDeleteLob();
testUpdateLob();
}
public static InputStream string2InputStream(String str) {
if (str == null) return null;
return new ByteArrayInputStream(str.getBytes());
}
public static String inputStream2String(InputStream is) {
StringBuffer sb = new StringBuffer();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String inputLine;
try {
while ((inputLine = br.readLine()) != null) {
sb.append(inputLine).append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
}
发表评论
-
文件存储到 Oracle 的存储过程用的外部BLOB的方式
2012-04-25 17:24 834一个存储图片文件的过程,任何开发工具都可以通过调用过程把图片文 ... -
Linux 安装 Mysql
2012-03-06 16:37 669一、引言 想使用Linux已经很长时间了,由于没有硬性任 ... -
sql查看oracle tablespace剩余空间
2012-01-01 10:46 1605select a.TABLESPACE_NAME, a.BYT ... -
oracle报错ID(一)
2011-12-06 08:55 1788ORA-00001: 违反唯一约束 ... -
ORACLE错误一览表
2011-06-03 16:52 638ORA-00001: 违反唯一约束 ... -
Oracle 使用总结(收藏于论坛)
2011-05-08 20:20 653一.Oracle数据库中常用的 ... -
oracle中scott/tiger、sys、SYSDBA、system都是什么用
2011-03-07 21:33 1152scott 是个演示用户,是让你学习ORACLE用的 SYS ... -
Oracle 一次插入多条记录的方法
2011-03-04 13:01 1060原来一次插入多条记录是用这个方法,需要用到dual 表, ... -
为Oracle字段建索引
2011-03-04 09:55 1139一、查看表中所有的索引,注意表名必须要大写SQL> se ... -
查看及删除oracle序列的方法
2011-03-04 09:37 970一、查看所有序列 select * from u ... -
Oracle 9i主键自增长
2011-03-02 20:50 779<!--StartFragment --> ... -
Oracle连接池
2011-03-01 18:00 1069Oracle连接池 public class Conn ... -
jdbc连接数据库操作
2011-02-28 13:27 775好久没有操作数据库,今天上午连接Oracle的,竟然不知道怎么 ... -
常用的Oracle命令
2011-01-14 16:33 946ORACLE数据库维护 01. ORACLE数 ... -
oracle的blob,clob的读写
2010-10-26 19:32 1040JDBC驱动程序的类型: JDBC-ODBC桥;部分本地API ... -
将文档以BLOB类型存入Oracle数据库中
2010-10-26 16:06 1174头痛了两天的问题终于得到解决了,特此写下(原创): c ... -
向oracle中插入BLOB对象
2010-10-25 20:19 1434package oracle.otnsamples.jdbc. ... -
How To Handle CLOBs Easily in JDBC?
2010-10-24 11:07 757How To Handle CLOBs Easily in ... -
Blob、InputStream、byte 互转
2010-10-24 10:55 1248来自 sukyle的专栏 在我们的程序开发当中,经常会用到j ... -
将clob 转换成 String
2010-10-24 10:53 1072将clob 转换成 String 文章分类:Java编程 ...
相关推荐
通过spring存blob和clob数据到sybase数据库中,压缩包里包含了三种方式,(1)spring+hibernate,切面事务(aop),存lob数据,(2)spring+hibernate存lob数据,(3)spring+jdbc存lob数据。
用过Oracle的人都知道,Oracle有一种数据类型叫VARCHAR2,用来表示不定长的字符串。VARCHAR2也是Oracle公司推荐使用的类型。但使用VARCHAR2有个问题:最大只能表示4000个字符,也就相当于2000个汉字。如果你的程序中...
Oracle数据库中LOB的调优.pdf
直接用就可以,特别简单,简单易懂 代码有注释很好看懂
测试oracle数据库中,lob字段在不同参数条件下,删除数据后占用空间的情况。 测试1 测试disable storage in row下的lob字段 测试2 测试非disable storage in row模式下 该模式为默认模式,既小于4k的数据不会存在lob...
我们首先表明,现有的通过流动性变化的主要模式(通过主成分分析提取)的解释力量化流动性共性的工作未能解释数据中的重尾特征,从而产生潜在的误导性结果。 我们采用独立成分分析,它既可以消除资产横截面中的流动...
cx_Oracle.LOB类型数据转化成字典方法 def cxOracleolbTrasferDict(dbsearchresult): readstr = "" for i in dbsearchresult.read(): readstr = readstr + i responsedict = eval(readstr) return ...
Oracle数据库数据表空间添加数据文件。可以解决 ORA-1691: unable to extend lobsegment 错误
主要功能点: 不需要运行Oracle数据库软件,ODU直接读取数据库文件解析数据。 支持ASM,能够直接从ASM磁盘中导出数据,即使相关的磁盘组不能成功mount 支持从ASM中直接抽取出数据文件和其他任意存储在ASM中的文件...
对非DB2数据库的数据复制, 不直接支持LOB(BLOB,ClOB)等大对象数据类型,但在实际应用中,用户需要复制的表中有可能有BLOB等大对象数据,如果数据目标为Oracle,这类大对象复制的需求可通过对WII的复制进行特殊配置实现...
7、LOB数据类型用于存储大型的,没有被结构化的数据,例如二进制文件,图片文件,LOB主要分为BLOB和CLOB,BLOB数据类型用于存储二进制对象:图像,音频,视频...CLOB数据类型用于存储字符格式的大型对象 ...
只需要安装oracle client在本地,然后配置好tns,输入连接名,用户名,密码,数据表的名称,文件名数据列名以及blob数据列名,就可以批量导出ORACLE数据库BLOB字段生成图片
NULL 博文链接:https://sosuny.iteye.com/blog/446112
当你在数据库中创建数据表的时候,你需要定义表中所有字段的类型。ORACLE有许多种数据类型以满足你的需要。数据类型大约分为:character, number, date, LOB, 和RAW等类型。虽然ORACLE8i也允许你自定义数据类型,...
KM_IKM Oracle Incremental UpdateLOB.xml KM_LKM SQL to SQL LOB(JYTHON).xml 里面包含两个KM 可以直接用
SQL Server存储LOB数据的策略与方法.pdf
Oracle的LOB(CLOB)大字段以及(SYS_LOB$$)清理.txt
Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...
Oracle主要 Oracle主要 数据类型 4-1 Character 数据类型 Number 数据类型 Date 数据类型 Raw 和 Long Raw 数据类型 LOB 数据类型 Oracle 主要数据类型 4-2 Character 数据类型 ― Char ― Varchar2 ― Long Number ...
sdbmigrationtool SequoiaDB数据库集合间数据迁移工具,支持结构化,半结构化和Lob对象的迁移,提供多线程,限速,校正,修复功能。当前版本支持功能如下:提供多线程并发功能支持输出迁移速率的统计信息结构化,半...