一、问题描述:
把一个大对象(文件或者超大字符串)存储到数据库中(数据库表中文件字段类型为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处理的方法不一样,需要了解其原理后针对性使用。
分享到:
相关推荐
主要介绍了Java 实现Redis存储复杂json格式数据并返回给前端操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
相信大家都知道存储过程是在大型数据库系统中,一组为了完成特定功能的SQL语句集。存储过程是数据库中的一个重要对象,任何一个...Java调用mysql存储过程,实现如下,有需要的朋友们可以参考借鉴,下面来一起看看吧。
根据官网和网上分享的代码自己整理了一个阿里云OSS工具类,自动创建标准公开权限的存储空间,支持上传图片,音频,视频,PDF各种文件,批量上传,上传后支持在线预览,文件路径处理,浏览器文件下载(支持源文件中文...
已实现对象分页列表、对象上传(包含文件完整上传和分片)、对象下载、批量删除对象。其中分片支持断点续传,并实现异步线程池的多线程上传,加快了响应速度。
每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM...java实现内存动态分配目录 一.实验原理 二.实验流程图 三.实验代码 四.实验结果
用java语言建立一种动态内存缓中间接,附带了源代码和Jar打包文件,在开发具有缓冲的产品中可以使用
minio 兼容Amason的S3分布式对象存储项目,采用Golang实现,客户端支持Java,Python,Javacript, Golang语言。 Minio可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作 ...
腾讯云--对象存储开发文档
根据Java面向对象吃货联盟项目修改为通过HashMap存储菜品和订单(其实ArrayList更简单) 实现的功能:订餐,查看餐袋,签收订单,删除订单,我要点赞,退出系统 定义的类:菜品类、订单类、测试类(可以把里面实现的...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
Minio对象存储及Springboot整合Minio分片上传文章----代码
主要介绍了java实现ArrayList根据存储对象排序功能,结合实例形式分析了java针对ArrayList的相关运算、排序操作技巧,需要的朋友可以参考下
基于Java的对象存储管理系统的设计与实现.pdf Java 程序开发 软件开发 参考文献 专业指导 计算机 课程资料 学习资料
实现阿里云OSS对象存储完整代码全网唯一;具体里面有说明文件,说明文件中还说明了其它技术;
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、...Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java中的序列化机制有两种实现方式: 一种是实现Serializable接口 另一种是实现Externalizable接口 区别: 实现Serializable接口 1 系统自动储存必要的信息 2 Java内建支持,易于实现,只需实现该接口即可,无须任何...
springboot整合京东云OSS对象储存.实现文件/图片存储,下载,删除操作.有完整的demo.
本程序是用java语言编写的控制台程序。能实现如下功能:增加人名,电话号码,以及备注信息。查找。排序。列出所有人信息。把信息存入txt文档中。从记事本中读取所有人信息。详细说明请见包中.doc文档。
这一约束限制了程序的灵活性,所以虽然某些java数据存储于堆栈中——特别是对象引用,但是java对象并不存储其中。 3) 堆 一种通用的内存池(也位于RAM区),用于存放所有的java对象。堆不同于堆栈的好处是:编译器...
11.1.3 Java大对象类型的Hibernate映射类型 11.1.4 JDK自带的个别Java类的Hibernate映射类型 11.1.5 使用Hibernate内置映射类型 11.2 客户化映射类型 11.2.1 用客户化映射类型取代Hibernate组件 11.2.2 ...