Hibernate 中Blob字段的使用

猫咪以前发了一个关于在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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值