黑马程序员技术交流社区
标题:
oracle中访问lob大数据怪现象求高手指点
[打印本页]
作者:
Jeik
时间:
2014-11-9 16:00
标题:
oracle中访问lob大数据怪现象求高手指点
问题描述:向数据库中插入大文本数据,以及从数据库中读取大文本
问题是数据插入后用cmd 查询数据库,查询出来的结果只有几行数据,但是我从数据库中读取打印到控制台又是对的!
问题2插入二进制的大数据比如图片:插入大数据之后,在从数据库中拷贝出来的数据比原始数据大了几十倍而且图片还打不开!
代码如下:
package cn.jdbc;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import oracle.sql.BLOB;
import cn.utils.JdbcUtil;
public class JdbcAccessBigData {
public static void main(String[] args) {
//insertAndReadBigText();//代表大文本数据
insertAndCopyPicture();//代表大型的二进制码数据,图片,视频等
}
@SuppressWarnings("deprecation")
private static void insertAndCopyPicture() {
Connection conn=JdbcUtil.getConnection();
Statement st=null;
PreparedStatement ps=null;
ResultSet rs=null;
String sql="insert into bigPicture values(?)";
String sql2="select picture from bigPicture";
try {
//将数据插入到数据库,这种方式只适合MySQL,不适合Oracle
/*ps=conn.prepareStatement(sql);
File file=new File("src/cn/ojdbc/wusi.jpg");
InputStream ins=new BufferedInputStream(new FileInputStream(file));
ps.setBinaryStream(1, ins);//2进制字节流
//ps.setBlob(1, ins);
ps.execute();
ins.close();*/
/**Oracle 版本,从java中向数据库中插入图片 :*/
st=conn.createStatement();
conn.setAutoCommit(false);
st.executeQuery("insert into bigPicture values(empty_blob())");
rs=st.executeQuery("select picture from bigPicture for update");
if(rs.next()){
//注意这里的BLOB对象时oracle里面的不是java中的
BLOB blob=(BLOB) rs.getBlob("picture");
@SuppressWarnings("unused")
OutputStream out=blob.getBinaryOutputStream();
File file=new File("src/cn/ojdbc/wusi.jpg");
InputStream ins=new BufferedInputStream(new FileInputStream(file));
byte[] buf=new byte[1024];
int n=0;
while((n=ins.read(buf))!=-1){
// 下面这样写报错--java.io.IOException: ORA-22920: 未锁定含有 LOB 值的行
//是因为select中没有写 for update
out.write(buf, 0, n);
}
out.flush();
out.close();
ins.close();
}
//从数据库中读取数据显示,貌似对于这样的数据好像不行。只能拷贝?
//这里出现的问题 从数据库中拷贝出来的图片大小放大了n倍,而且图片打不开?
st=conn.createStatement();
rs=st.executeQuery(sql2);
if(rs.next()){
InputStream ins2=rs.getBinaryStream(1);
OutputStream out=new BufferedOutputStream(new FileOutputStream("src/cn/ojdbc/wusi2.jpg"));
byte[] buf=new byte[1024];
int n=0;
while((n=ins2.read())!=-1){
out.write(buf,0,n);
out.flush();
}
out.close();
ins2.close();
}
} catch (Exception e) {
throw new RuntimeException(e);
}finally{
JdbcUtil.freeSource(rs, ps, conn);
}
}
//向数据库中插入大文本数据,以及从数据库中读取大文本
//这里的问题是用cmd 查询数据库,查询出来的结果不对,但是我从数据库中读取打印又是对的???
private static void insertAndReadBigText() {
Connection conn=JdbcUtil.getConnection();
PreparedStatement ps=null;
Statement st=null;
ResultSet rs=null;
String sql="insert into bigText values(?)";
String sql2="select * from bigText";
try {
//向数据库中插入大文本数据
ps=conn.prepareStatement(sql);
File file=new File("src/cn/utils/JdbcUtils.java");
Reader reader=new BufferedReader(new FileReader(file));
//将大文本转换成字符流,存放到数据库的字段中
ps.setCharacterStream(1,reader,file.length());
ps.execute();
reader.close();//关闭资源!!!
//读取数据库中的大文本
st=conn.createStatement();
rs=st.executeQuery(sql2);
if(rs.next()){
//将大文本字段转换成字符流
BufferedReader br=new BufferedReader(rs.getCharacterStream("bigTxt"));
int n=0;
while(br.read()!=-1){
System.out.println(br.readLine());
}
br.close();//关闭资源
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
JdbcUtil.freeSource(rs, ps, conn);
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2