一、问题描述:
把一个大对象(文件或者超大字符串)存储到数据库中(数据库表中文件字段类型为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处理的方法不一样,需要了解其原理后针对性使用。
分享到:
相关推荐
总之,Minio作为Java分布式文件对象存储的解决方案,提供了强大且灵活的功能。通过Java SDK,开发者可以轻松地实现各种文件操作,满足不同的业务需求。在使用过程中,确保遵循最佳实践,如适当管理资源、处理错误和...
总的来说,"ctjdfs"是一个用Java实现的轻量级分布式文件系统,它解决了大容量存储、负载均衡和高可用性等问题。通过理解其核心功能和技术实现,我们可以更好地运用和优化这类分布式存储解决方案,满足日益增长的海量...
在数据库管理中,存储过程(Stored Procedure)是一种预编译的SQL代码集合,它封装了特定的功能,并在需要时由应用程序调用...这使得开发者能够在Java应用中灵活地利用数据库提供的强大功能,实现更高效的数据处理。
在这个Java实现的存储管理项目中,很可能包含了上述一些或全部的内存管理机制。使用Java进行实现,可以利用其强大的面向对象特性,以及丰富的库支持,来简化内存管理的复杂性。Eclipse作为开发环境,提供了代码调试...
2. **JSON字符串存储**:最简单的方式是将Java对象转换为JSON字符串,然后存储为Redis中的String类型。Fastjson库在这里被用到,其`toJSONString`方法可以将Java对象转化为JSON格式的字符串。获取时,直接返回JSON...
9. **集合框架**:Java集合框架提供了各种数据结构(如List、Set、Queue等)和算法,方便存储和操作对象。ArrayList和LinkedList是两种常用的List实现,HashSet和HashMap则是常见的Set实现。 10. **内部类**:Java...
### Java Web应用中的对象存储管理概述 在Java Web开发中,有效地管理用户会话和数据交互对于构建功能丰富且响应迅速的应用程序至关重要。本文将深入探讨Java Web应用中常见的对象存储管理技术,包括Cookie、...
### 探讨Java的对象在内存中产生的机制 #### 一、引言 Java作为一种主流的面向对象编程语言,其对象的创建与管理是程序运行的基础。本文将详细探讨Java对象在JVM中的创建过程以及其内存布局,帮助读者更深入地理解...
本项目“基于Java实现的分布式存储系统”旨在提供一个可扩展、高可用、容错性强的解决方案,以满足企业对大规模数据存储的需求。Java作为一种广泛使用的编程语言,具有跨平台性、稳定性和丰富的库支持,使其成为实现...
本篇文章将深入探讨如何在SpringBoot项目中集成AWS S3 SDK(Java V2版本),实现对象的分页列表、上传、下载和批量删除等功能,特别是重点讲解断点续传和分片上传的实现。 首先,集成AWS S3 SDK需要在项目中添加...
这个名为"Java存储与读取对象.rar"的压缩包文件显然包含了与Java编程相关的资源,特别是关于对象存储和读取的实践示例。让我们深入探讨一下Java中对象存储和读取的相关知识点。 首先,Java提供了多种方式来持久化...
9. **集合框架**:Java集合框架包括接口(如List、Set、Map)和实现类(如ArrayList、HashSet、HashMap等),提供了存储和管理对象的容器,是Java编程中不可或缺的一部分。 10. **泛型**:泛型允许在类、接口和方法...
7. Java中的引用类型变量可以指向不同子类的对象,这种现象称为动态绑定或多态,是Java实现灵活性的关键。 五、访问控制修饰符 8. Java提供了public、private、protected和默认四种访问控制修饰符,用于控制类、...
在本课程"accp7.0使用Java实现面向对象编程"中,我们将深入探讨如何利用Java进行高效且可维护的面向对象编程。 1. **封装**:封装是面向对象的核心特性之一,它将数据和操作数据的方法绑定在一起,形成一个独立的...
Externalizable 接口提供了 writeExternal 和 readExternal 两个方法,用于手动实现对象的序列化和反序列化。 在实际应用中,序列化机制可以应用于各种领域,如网络通信、数据存储、分布式计算等。例如,在网络通信...
Java 调用 SQL Server 存储过程是指在 Java 应用程序中调用 SQL Server 数据库中的存储过程,以实现数据的增删改查等操作。下面是关于 Java 调用 SQL Server 存储过程的知识点: 1. 创建存储过程 在 SQL Server 中...
由于堆内存是所有线程共享的,因此对象实例的创建和访问需要考虑线程安全问题。 3. **栈内存分配** 栈内存是线程私有的,每个线程都有自己的栈。每当一个方法被调用时,都会在栈中创建一个栈帧,用于存储局部变量...
根据官网和网上分享的代码自己整理了一个阿里云OSS工具类,自动创建标准公开权限的存储空间,支持上传图片,音频,视频,PDF各种文件,批量上传,上传后支持在线预览,文件路径处理,浏览器文件下载(支持源文件中文...
Java语言是实现面向对象编程的常用平台,其语法简洁且功能强大,非常适合学习和实践OOP理念。北大青鸟6.0 S2课程中的这个部分,旨在帮助学生深入理解Java语言的面向对象特性,并掌握实际应用技巧。 1. 封装:封装是...
在Java端,我们需要实现一种机制,将`ArrayList`中的`people`对象转换为Oracle可以理解的数组格式。此过程涉及使用`StructDescriptor`和`ArrayDescriptor`创建描述符,然后使用这些描述符构建`STRUCT`和`ARRAY`对象...