猫咪以前发了一个关于在Hibernate中使用Clob字段的文章。可以做到以String的方式,直接把大量文字写入字段中而不用进行复杂编码。现在猫咪把使用Blob的方法也写出来。猫咪很懒,所以很久没有更新博客了。大家多多包涵!
下面是猫咪的例子(仍然使用Oracle,请确保使用最新的JDBC驱动)
首先建立一个数据库表
create table textblob (tid number(38,0),lob blob)
然后建立对应的Java对象
public class testblob {
private long id;
private byte[] lob;
//set和get方法略...
}
最后是Hibernate配置和映射文件。
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
oracle.jdbc.driver.OracleDriver
</property>
<property name="connection.url">
jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:orcl
</property>
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
<property name="connection.username">xxxxxx</property>
<property name="connection.password">xxxxxx</property>
<property name="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_statements">100</property>
<property name="hibernate.c3p0.idle_test_period">120</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.connection.SetBigStringTryClob">
true
</property>
<property name="hibernate.jdbc.use_streams_for_binary">
true
</property>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JDBCTransactionFactory
</property>
<mapping resource="org/Miao/testblob.hbm.xml" />
</session-factory>
</hibernate-configuration>
注意配置文件中“hibernate.jdbc.use_streams_for_binary”这个部分。这是Oracle必须添加的属性。其它配置没有什么特别的。SQL Server不需要这个属性。同时配置文件配置了一个C3P0数据库连接池。
映射文件如下:
<hibernate-mapping package="org.Miao">
<class name="testblob" table="tblob">
<id name="id" column="tid">
<generator class="native"></generator>
</id>
<property name="lob" column="tlob" type="binary">
</property>
</class>
</hibernate-mapping>
然后就可以测试一下了。写一个运行的测试类Run.class。
public class run {
public static void main(String[] args) {
Configuration configuration = new Configuration();
configuration.configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
File f = new File("d:/f.exe");
byte[] tmp = new byte[(int) f.length()];
try {
FileInputStream fi = new FileInputStream(f);
fi.read(tmp);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
testblob test = new testblob();
test.setId(5);
test.setLob(tmp);
Transaction t = session.beginTransaction();
try {
session.saveOrUpdate(test);
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
session.close();
}
}
}
现在进入数据库的话,可以看到数据库记录中已经增加了一条,文件已经被保存到数据库里了。但是,这么做有一个很大的问题,那就是内存。在Eclipse+WTP的环境下,加入的文件稍微大一点,就会造成OutofMemony异常。因为用这种方法存入数据库,需要把文件全部读入内存才可以。文件一大,就会造成内存溢出,即使把JVM使用的内存调大,保存大文件也是非常慢的。我的调试环境,存一个10M的文件,单用户Tomcat(内存调整到256-512M)跑,Oracle10g又是远程,需要好几分钟。多用户条件下,性能可想而知。而且,一旦多用户同时保存或同时读取大文件,立马会造成内存占用暴增,最后溢出。所以,使用这种方式处理Blob,一定要注意,不要保存大文件,我觉得最好不要超过1M。
分享到:
相关推荐
本篇文章将深入探讨如何使用Hibernate读取数据库中的Blob字段,以及涉及到的相关知识点。 首先,我们需要理解Blob类型在数据库中的含义。Blob是Binary Large Object的缩写,它是一种可以存储大量二进制数据的数据...
本篇将详细介绍如何使用JDBC(Java Database Connectivity)与Hibernate框架来操作Oracle数据库中的BLOB字段。 首先,Oracle数据库的BLOB字段提供了对大对象的高效存储,它的性能优于LONG字段,尤其适合存储大容量...
在 Java 应用开发中,尤其是使用 ORM 框架如 Hibernate 进行持久化层开发时,如何高效地处理 BLOB 类型字段成为了一个关键问题。 本文档将详细介绍如何使用 Hibernate 对 Blob 类型字段进行数据添加的过程,并通过...
- 在Hibernate的实体类中,我们需要为Clob和Blob字段定义对应的属性,并使用`@Lob`注解来标记它们。例如: ```java @Lob private Clob largeText; @Lob private Blob binaryData; ``` - 对于Clob,可以使用`...
本篇将详细介绍在Hibernate中如何处理Clob和Blob字段,以及使用特定Oracle JDBC驱动程序的优势。 首先,Hibernate通过`org.hibernate.type`包中的`ClobType`和`BlobType`来映射Clob和Blob。在实体类中,你需要定义...
在IT领域,尤其是在数据库...总之,无论是使用JDBC还是Hibernate,正确处理Oracle中的BLOB字段都是至关重要的,尤其是在处理大量二进制数据的应用场景下。掌握上述流程和技巧,能够有效提升数据操作的效率和安全性。
在Java的持久化框架Hibernate中,BLOB(Binary Large Object)和CLOB(Character Large Object)是用来处理大数据类型的,如图像、音频、大型文本等。本文将深入探讨Hibernate如何进行BLOB和CLOB的操作,以及相关的...
接下来,我们需要在映射文件(.hbm.xml)中配置Blob字段,比如: ```xml <hibernate-mapping> <!-- Blob类型的映射 --> <column name="PICTURE" length="1000000" sql-type="BLOB"/> </hibernate...
通过理解这些问题和解决方案,我们可以更有效地在Hibernate中管理和操作MySQL的BLOB字段。同时,持续关注官方文档和社区更新,以获取最新的最佳实践和修复。在实际项目中,结合适当的测试和性能监控,可以帮助我们更...
本实例主要探讨如何利用Hibernate和Struts框架来处理MySQL数据库中的BLOB字段,实现文件的上传与下载功能。 **一、Hibernate框架** Hibernate是一个强大的Java持久化框架,它简化了数据库操作,提供了对象关系映射...
以下是使用JDBC直接操作Blob字段的步骤: 1. 注册并加载Oracle的JDBC驱动: ```java DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); ``` 2. 创建数据库连接: ```java Connection ...
在实体类中,你可以定义一个Blob类型的属性来表示数据库中的Blob字段: ```java @Entity public class MediaEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Lob ...
在Java Web开发中,...本文将详细介绍如何在Hibernate中操作Blob和Clob字段,实现数据的存储与读取。 首先,我们需要在Hibernate映射文件(.hbm.xml)中定义Blob和Clob字段。对于Blob,可以这样声明: ```xml ...
hibernate Blob、Clob字段的映射的例子.数据库mysql,数据库放在文件夹里面,例子的说明文章在我的csdn blog: http://blog.csdn.net/zhengcandan
综上所述,这个实例展示了如何在Oracle数据库中使用Hibernate处理Blob数据,结合Uploadify实现文件上传。这种解决方案不仅适用于Oracle,理论上也适用于其他支持Blob类型的数据库,如MySQL和MSSQLServer。了解这些...
在Hibernate的`SessionFactory`配置中,需要指定`lobHandler` Bean来处理CLOB和BLOB字段: ```xml <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ...