java – Spring,Hibernate,Blob懒加载

我需要帮助与迟缓的blob加载在Hibernate。
我在我的Web应用程序中有这些服务器和框架:MySQL,Tomcat,Spring和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堆空间”
我试图在blobFields中写入表的每一行的空值。在这种情况下,应用程序工作正常,内存不会出现。我有一个结论,被标记为懒惰(@Basic(fetch = FetchType.LAZY))的blob字段并不懒惰,实际上!如何解决这个问题?
非常感谢提前。

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

有些用户报告说,懒惰加载@Lob doesn’t work with all drivers/database

有些用户报告使用bytecode instrumentation(javassit?cglib?)时可以正常工作。

但是在文档中我没有找到任何明确的引用。

最后,recommended workaround是使用“假”一对一的映射而不是属性。从现有类中删除LOB字段,创建引用同一个表的新类,相同的主键,只有必要的LOB字段作为属性。指定映射为一对一,fetch =“select”,lazy =“true”。只要你的父对象仍然在你的会话中,你应该得到你想要的。 (只是将其转换为注释)。

翻译自:https://stackoverflow.com/questions/2605477/spring-hibernate-blob-lazy-loading

转载注明原文:java – Spring,Hibernate,Blob懒加载