Spring, Будьте в спящем режиме, Блоб ленивая загрузка

Я нуждаюсь в помощи с ленивым блобом, загружающимся в, в спящем режиме. У меня есть в моем веб-приложении эти серверы и платформы: MySQL, Tomcat, Spring и В спящем режиме.

Часть конфигурации базы данных.

<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 нулевых значениях на каждой строке таблицы. В этом случае приложение хорошо работает, память не выходит. У меня есть заключение, что поле блоба, которое отмечено как ленивое (@Basic(fetch=FetchType.LAZY)) не лениво, на самом деле!

25
задан Cœur 2 May 2018 в 14:17
поделиться

2 ответа

Я запуталась. Эммануэль Бернар написал в ANN-418 , что @Lob по умолчанию ленивы (т.е. вам даже не нужно использовать @Basic (fetch = FetchType.LAZY) аннотация).

Некоторые пользователи сообщают, что отложенная загрузка @Lob работает не со всеми драйверами / базами данных .

Некоторые пользователи сообщают, что это работает при использовании инструментария байт-кода (javassit? Cglib?).

Но я не могу найти четких ссылок на все это в документации.

В конце рекомендуется обходной путь - использовать «поддельные» однозначные сопоставления вместо свойств. Удалите поля LOB из существующего класса, создайте новые классы, ссылающиеся на ту же таблицу, тот же первичный ключ и только необходимые поля LOB в качестве свойств. Укажите сопоставления как один к одному, fetch = "select", lazy = "true". Пока ваш родительский объект все еще находится в вашем сеансе, вы должны получить именно то, что хотите. (просто перенесите это в аннотации).

31
ответ дан 28 November 2019 в 20:53
поделиться

Я бы предложил вам использовать наследование для работы с этим сценарием. Иметь базовый класс без блоба и производный класс, содержащий массив байтов. Вы будете использовать производный класс только тогда, когда вам нужно будет отобразить blob в пользовательском интерфейсе.

4
ответ дан 28 November 2019 в 20:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: