猫咪以前发了一个关于在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字段
有关jdbc+hibernate存取blob字段的知识
hibernate对Blob类型字段进行数据添加.txt
使用Hibernate映射Blob,Clob字段,并对这些字段完成存,取功能
Hibernate对BLOB CLOB操作,详细的操作说明
NULL 博文链接:https://sjsky.iteye.com/blog/1154916
oracle的jdbc驱动程序,用这个版本的操作Clob,blob类型的数据很方便。 博文链接:https://zhenjw.iteye.com/blog/173419
使用JDBC和Hibernate来写入Blob型数据到Oracle中;使用JDBC和Hibernate来写入Blob型数据到Oracle中
hibernate Blob、Clob字段的映射的例子.数据库mysql,数据库放在文件夹里面,例子的说明文章在我的csdn blog: http://blog.csdn.net/zhengcandan
NULL 博文链接:https://jaychang.iteye.com/blog/832693
使用hibernate+struts 实现对word ,excel,ppt等文件的上传下载,上传文件之后根据文件名称进行下载.
本篇是对使用jdbc,hibernate处理clob/blob字段进行了详细的分析介绍,需要的朋友参考下
一个完整的工程,主要功能为:spring+hbernate对clob、blob字段的处理 包括:数据脚本、典型的SSH框架处理,以及spring、hibernate数据批量保存等功能源码、所用到的lib包 数据环境为:oracle 10G 开发:Mycelipse5.1...
spring mvc+hibernate完成图片上传操作,存储至blob字段。
是我自己验证过的 用的是oracle10数据库 文件里面有具体的配置。
Struts2,Hibernate3,Spring2实现oracle存取blob字段(图片等二进制文件) Myeclipse6.0下开发 哈哈,原来2分的,现在免费了!!!!!!!!!!!!!!!!!!!!!!!!给评分哦!!!!!!!!!!!!!!!!
struts+hibernate+spring+blob 三个框架集成了一下,主要包括利用struts的上传附件功能,并把上传的图片存储到oracle的blob字段。并提供显示。 没做过多的限制,还有很多bug别见怪,功能跑得通!