Hibernate - синхронизация сущностей с пакетными обновлениями базы данных - PullRequest
2 голосов
/ 12 июля 2011

Привет. Я надеялся получить информацию по следующей проблеме. Я новичок в Hibernate и пытаюсь собрать воедино головоломку для этого.

Проблема: в моей базе данных есть данные, которые обновляются один раз в день. Я хочу синхронизировать свои сущности с этим и обновлять их. Я реализовал таймер Spring / Quartz, чтобы вызвать мой класс реализации hibernate для обновления сущностей. Я пытаюсь убедиться, что каждый раз, когда этот метод вызывается, он очищает все текущие объекты, чтобы они могли быть обновлены. Что будет лучшим подходом для этого?

Использование Hibernate 3.2, интегрированного с Spring.

Предлагаемое решение:

  1. Это где я бы использовал менеджер сущностей для управления ими?

Я пытался использовать команду Session.flush и очистку SesionFactory, но это не сработало.

Конфигурация Spring / Hibernate

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-3.0.xsd
                    http://www.springframework.org/schema/util
                    http://www.springframework.org/schema/util/spring-util-3.0.xsd">


    <!--     Defines the hibernate session factory to be used by the hibernate support dao classes -->
    <bean id="hibernateSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
        <property name="dataSource" ref="webDataSrc" />
        <property name="annotatedClasses"> 
                <list> 
                        <value>test.foo</value> 
                </list> 
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="debug">true</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
                <prop key="hibernate.cglib.use_reflection_optimizer">false</prop>
            </props>
        </property>
    </bean>

    <!-- get the datasource from the context -->
    <bean id="webDataSrc" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
        <property name="jndiName" value="java:comp/env/datasource"/>
    </bean>

    <bean id="daoTxTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager" ref="transactionManager" />
        <property name="transactionAttributes">
            <props>
                <prop key="get*">
                    PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED
                </prop>
            </props>
        </property>
    </bean>

    <bean name="openSessionInViewInterceptor"
        class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
        <property name="sessionFactory" ref="hibernateSessionFactory" />
        <property name="singleSession" value="true" />
    </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="hibernateSessionFactory"/>
        <property name="nestedTransactionAllowed" value="true" />

    </bean>

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Вы могли бы сделать пару вещей здесь. Я бы порекомендовал использовать Query.setCacheMode(CacheMode.REFRESH), если вы используете кеш запросов. Это заставит обновлять сущности во время запроса.

Документация Hibernate В остальном говорится ...

Это особенно полезно в тех случаях, когда основные данные могут иметь обновлен отдельным процессом

Вы также можете использовать SessionFactory.evictQueries(), но это приведет к удалению всего кэша запросов, который может быть излишним.

Наконец, вы также можете использовать EntityManager.refresh(entity) для перезагрузки определенной сущности, если она известна.

0 голосов
/ 12 июля 2011

Почему вы продолжаете открывать сессии Hibernate так долго? Они не должны быть открыты в течение дня или дольше. Вы должны открыть сеанс, прочитать данные, сделать свое дело и затем закрыть сеанс. Если вам нужно хранить данные между сеансами, вы должны использовать свой собственный кеш.

Вы сохраняете некоторый контрольный журнал в своей базе данных, когда эти ежедневные обновления завершены, верно? Таким образом, каждый раз, когда вы открываете сеанс Hibernate, проверяйте, обновлен ли ваш внутренний кэш. Если данные в базе данных были обновлены после заполнения кеша, выгрузите кеш и перезагрузите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...