浏览 6003 次
锁定老帖子 主题:Java实现大对象存储的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-12-08
把一个大对象(文件或者超大字符串)存储到数据库中(数据库表中文件字段类型为BLOB),出现IO异常 二、问题分析: 二进制文件应该存为BLOB类型,但JDBC并不支持直接将二进制文件存入数据库中BLOG类型的字段中,如果这样做,将会得到IO异常而不是SQL异常。 三、解决方案: 1.要把一个二进制文件存入oracle,如果用标准的JDBC,数据库表相应的字段类型是LONG ROW类型,示例代码如下: 创建表,其中detail字段保存文件内容 Create table tbl_file(name varchar(20),detail long row); 将文件保存至数据库 File file = new File("temp.gif"); int fileLength = (int)file.length(); InputStream fin = new FileInputStream(file); PreparedStatement pstmt = conn.prepareStatement("insert into tbl_file values('temp.gif',?)"); pstmt.setBinaryStream(1,fin,fileLength); pstmt.executeUpdate(); 2.如果存储文件对象的数据库字段一定要用BLOB类型存储,就必须使用Oracle自己的方法 创建表,其中detail字段保存文件内容 create table tbl_file(name varchar(20),detail BLOB); 保存文件至数据库主要实现代码: con.setAutoCommit(false); stmt.executeUpdate("insert into tbl_file values('temp.gif',null)"); rs = stmt.executeQuery("select detail from tbl_file where name='aaa.gif' for update"); if(rs.next()) { Blog blob = rs.getBlob("detail"); BinaryOutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream(); byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize()]; File file = new File("temp.gif"); InputStream fin = new FileInputStream(file); int len = 0; while((len = fin.read(b)) != -1) { out.write(b,0,len); } fin.close(); out.close(); conn.commit(); } 四、经验总结: 对于不同类型的数据库字段,JDBC处理的方法不一样,需要了解其原理后针对性使用。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |