Spring、Hibernate、Blob 延迟加载 [英] Spring, Hibernate, Blob lazy loading

查看:24
本文介绍了Spring、Hibernate、Blob 延迟加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要有关在 Hibernate 中延迟加载 blob 的帮助.我的 Web 应用程序中有这些服务器和框架:MySQL、Tomcat、Spring 和 Hibernate.

I need help with lazy blob loading in Hibernate. I have in my web application these servers and frameworks: MySQL, Tomcat, Spring and Hibernate.

数据库配置部分.

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="driverClass" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>

    <property name="initialPoolSize">
        <value>${jdbc.initialPoolSize}</value>
    </property>
    <property name="minPoolSize">
        <value>${jdbc.minPoolSize}</value>
    </property>
    <property name="maxPoolSize">
        <value>${jdbc.maxPoolSize}</value>
    </property>
    <property name="acquireRetryAttempts">
        <value>${jdbc.acquireRetryAttempts}</value>
    </property>
    <property name="acquireIncrement">
        <value>${jdbc.acquireIncrement}</value>
    </property>
    <property name="idleConnectionTestPeriod">
        <value>${jdbc.idleConnectionTestPeriod}</value>
    </property>
    <property name="maxIdleTime">
        <value>${jdbc.maxIdleTime}</value>
    </property>
    <property name="maxConnectionAge">
        <value>${jdbc.maxConnectionAge}</value>
    </property>
    <property name="preferredTestQuery">
        <value>${jdbc.preferredTestQuery}</value>
    </property>
    <property name="testConnectionOnCheckin">
        <value>${jdbc.testConnectionOnCheckin}</value>
    </property>
</bean>


<bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" />

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation" value="/WEB-INF/hibernate.cfg.xml" />
    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
        </props>
    </property>
    <property name="lobHandler" ref="lobHandler" />
</bean>

<tx:annotation-driven transaction-manager="txManager" />

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

实体类部分

@Lob
@Basic(fetch=FetchType.LAZY)
@Column(name = "BlobField", columnDefinition = "LONGBLOB")
@Type(type = "org.springframework.orm.hibernate3.support.BlobByteArrayType")
private byte[] blobField;

问题描述.我试图在网页上显示与文件相关的数据库记录,这些记录保存在 MySQL 数据库中.如果数据量很小,一切正常.但是数据量很大我收到一个错误 java.lang.OutOfMemoryError: Java heap space我试图在表的每一行上写入 blobFields 空值.在这种情况下,应用程序工作正常,内存不会耗尽.我的结论是,标记为惰性的 blob 字段 (@Basic(fetch=FetchType.LAZY)) 实际上不是惰性的!

The problem description. I'm trying to display on a web page database records related to files, which was saved in MySQL database. All works fine if a volume of data is small. But the volume of data is big I'm recieving an error java.lang.OutOfMemoryError: Java heap space I've tried to write in blobFields null values on each row of table. In this case, application works fine, memory doesn't go out of. I have a conclusion that the blob field which is marked as lazy (@Basic(fetch=FetchType.LAZY)) isn't lazy, actually!

推荐答案

我很困惑.Emmanuel Bernard 在 ANN-418 中写道,@Lob 是懒惰的默认情况下(即您甚至不需要使用 @Basic(fetch = FetchType.LAZY) 注释).

I'm confused. Emmanuel Bernard wrote in ANN-418 that @Lob are lazy by default (i.e. you don't even need to use the @Basic(fetch = FetchType.LAZY) annotation).

一些用户报告延迟加载 @Lob 确实如此不适用于所有驱动程序/数据库.

Some users report that lazy loading of a @Lob doesn't work with all drivers/database.

一些用户报告说它在使用 字节码检测(javassit?cglib?).

Some users report that it works when using bytecode instrumentation (javassit? cglib?).

但是我在文档中找不到所有这些的明确参考.

But I can't find any clear reference of all this in the documentation.

最后,推荐的解决方法是使用 一个假"的一对一映射而不是属性.从现有类中删除 LOB 字段,创建引用相同表、相同主键和仅作为属性的必要 LOB 字段的新类.将映射指定为一对一,fetch="select",lazy="true".只要您的父对象仍在会话中,您就应该得到您想要的东西.(只需将其转换为注释即可).

At the end, the recommended workaround is to use a "fake" one-to-one mappings instead of properties. Remove the LOB fields from your existing class, create new classes referring to the same table, same primary key, and only the necessary LOB fields as properties. Specify the mappings as one-to-one, fetch="select", lazy="true". So long as your parent object is still in your session, you should get exactly what you want. (just transpose this to annotations).

这篇关于Spring、Hibernate、Blob 延迟加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆