복붙노트

[SPRING] 최대 절전 모드 스프링 주석 세션이 닫히지 않았거나 플러시되지 않음

SPRING

최대 절전 모드 스프링 주석 세션이 닫히지 않았거나 플러시되지 않음

저는 Hibernate와 트랜잭션 / 세션을 관리하기 위해 Spring 어노테이션을 사용하는 프로젝트를 '상속 (inherited)'했습니다. 또는 적어도 그것은 의미가 있습니다. 현재 Hibernate 세션은 결코 플러시되지 않으며 (FLUSH_MODE_NEVER로 설정 됨) DAO는 데이터베이스에 기록 될 데이터를 직접 플러시해야합니다.

또한 모든 DTO 객체는 최대 절전 모드 메모리에 상주하며 결과적으로 OutOfMemoryerror로 이어집니다.

나는 Spring / Hibernate에게 세션을 닫거나 트랜잭션을 커밋하도록 말할 필요가 있다고 믿는다. 내 컨트롤러 클래스에는 요청 처리를위한 주석이 달린 메서드가 있습니다.

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ...
    ...
}

applicationContetxt.xml 파일에서 최대 절전 모드 트랜잭션 관리자를 설정하고 주석을 사용하도록 스프링을 설정한다고 생각합니다.

<!-- hibernate3 transaction manager -->
<bean id="transactionManagerLocal" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="dataSource" ref="${local.data.source}" />
    <property name="sessionFactory" ref="localSessionFactory" />
</bean>

<!-- Demarcate using @Transactional annotation -->
<tx:annotation-driven transaction-manager="transactionManagerLocal" order="200" />

뿐만 아니라, DAO 각각에 대해 수동으로 플러시를 호출하지 않고 데이터를 DB에 쓰지 않는 방식으로 구성이 잘못되었다는 사실을 확신 할뿐만 아니라 트랜잭션 관리자가 플러시 및 세션 닫기를 사용할 수 있음을 알 수있는 로그 파일에서 :

INFO  [http-8080-2] TransactionFactoryFactory - Transaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory
INFO  [http-8080-2] TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
INFO  [http-8080-2] SettingsFactory - Automatic flush during beforeCompletion(): disabled
INFO  [http-8080-2] SettingsFactory - Automatic session close at end of transaction: disabled

스프링 / 하이버 네이트가 자동으로 DAO를 플러시하거나 세션을 닫아서 Hibernate가 사용하는 엄청난 양의 메모리를 막으려면 어떻게해야합니까?

환호 그리고

<!-- MySQL/InnoDB session factory -->
<bean id="localSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="${local.data.source}"/>
    <property name="mappingResources">
        <list>
            <value>net/company/projectname/domain/ExchangeRate.hbm.xml</value>
            <!-- Other  -->

        </list>
    </property>

   <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
            <prop key="hibernate.connection.zeroDateTimeBehavior">convertToNull</prop>
            <!-- 
            DOES NOTHING
            <prop key="hibernate.transaction.flush_before_completion">true</prop>
            <prop key="hibernate.transaction.auto_close_session">true</prop>
            -->
        </props>
    </property>
</bean>

<!-- hibernate3 transaction manager -->
<bean id="transactionManagerLocal" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="dataSource" ref="${local.data.source}" />
    <property name="sessionFactory" ref="localSessionFactory" />
</bean>


<!-- Demarcate using @Transactional annotation -->
<tx:annotation-driven transaction-manager="transactionManagerLocal" order="200" />

<bean id="exchangeRateDAO" class="net.company.project.dao.hibernate.impl.ExchangeRateDAOImpl">
     <property name="sessionFactory" ref="localSessionFactory"/>
 </bean>     

해결법

  1. ==============================

    1.내 청명한 동료 중 한 명은 문제가 무엇인지 발견했습니다.

    내 청명한 동료 중 한 명은 문제가 무엇인지 발견했습니다.

    어떤 의미가 있지만 오류 메시지 나 경고없이 데이터를 쓰지 못하면 엄청나게 위험한 것처럼 보입니다.

  2. ==============================

    2.hibernate 템플릿 대신에 또 다른 방법이있다. (Hibernate 템플릿은 Spring을 최대 절전 모드로 만들 것이고 Spring 3.1에서 deprecated되는 이유이다) 이 문제를 해결하는 열쇠는 dialct와 url을 제외한 최대 절전 모드의 구성을 제거하는 것입니다 간단한 방법으로 최대 절전 모드 속성에서 트랜잭션 항목 제거 Spring이 최대 절전 모드가 아닌 트랜잭션을 관리하기를 원하는 것처럼. Marten Deinum이이 URL http://forum.springsource.org/archive/index.php/t-47667.html에서 언급했듯이 여기 내 스프링 XML 구성 파일의 스 니펫입니다.

    hibernate 템플릿 대신에 또 다른 방법이있다. (Hibernate 템플릿은 Spring을 최대 절전 모드로 만들 것이고 Spring 3.1에서 deprecated되는 이유이다) 이 문제를 해결하는 열쇠는 dialct와 url을 제외한 최대 절전 모드의 구성을 제거하는 것입니다 간단한 방법으로 최대 절전 모드 속성에서 트랜잭션 항목 제거 Spring이 최대 절전 모드가 아닌 트랜잭션을 관리하기를 원하는 것처럼. Marten Deinum이이 URL http://forum.springsource.org/archive/index.php/t-47667.html에서 언급했듯이 여기 내 스프링 XML 구성 파일의 스 니펫입니다.

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">    
            <value>
                classpath:/com/spring/hibernate.cfg.xml
            </value>
        </property>       
        </bean>
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    

    여기에 최대 절전 모드 파일이있다.

    <session-factory> 
    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="connection.driver_class">org.postgresql.Driver</property>
    <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
    <property name="connection.username">root</property>
    <property name="connection.password">root</property>
    
    <mapping resource="com/spring/BloodType.hbm.xml" />
    </session-factory>
    

    당신의 메소드 나 클래스에 @Transactional을 쓰는 것을 잊지 마라. 또한 사용

    Session session = sessionFactory.getCurrentSession();
    

    BloodType b = new BloodType();
    b.setId(new Long(1));
    BloodType b1 = (BloodType)session.get(BloodType.class, 12L);
    session.delete(b1);
    session.save(b);
    

    session.flush ()도 transaction.commit ()도 필요없이 잘 작동합니다. 그것이되기를 바란다.

  3. ==============================

    3.최대 절전 모드 템플릿을 사용하여 해결합니다.

    최대 절전 모드 템플릿을 사용하여 해결합니다.

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
           hibernateTemplate = new HibernateTemplate(sessionFactory);
    }
    

    이 링크와 같은 템플릿을 사용하십시오. http://singgihpraditya.wordpress.com/2010/02/13/spring-3-0-and-hibernate-tutorial-part-1/

    귀하의 회신은 공유하는 데 큰 도움이 될 것입니다.

  4. ==============================

    4.트랜잭션 (주석 처리 된)이 성공하면 transaction.commit ()이 자동으로 호출되어 DB에 내용을 쓰게되고, 트랜잭션이 호출되고 예외가 발생하지 않는지 확인하십시오.

    트랜잭션 (주석 처리 된)이 성공하면 transaction.commit ()이 자동으로 호출되어 DB에 내용을 쓰게되고, 트랜잭션이 호출되고 예외가 발생하지 않는지 확인하십시오.

    세션 팩토리를 선언 된 트랜잭션에 연결해야합니다.

  5. from https://stackoverflow.com/questions/9072749/hibernate-spring-annotation-sessions-not-being-closed-flushed by cc-by-sa and MIT license