2010-03-19 6 views
1

구성 세부 사항입니다 공개하지 최대 절전 모드 :는 다음과 같은 데이터베이스 연결

<property name="hibernateProperties"> 
    <props> 
    <prop key="hibernate.dialect"> 
    org.hibernate.dialect.Oracle9iDialect 
    </prop> 
    <prop key="hibernate.show_sql">false</prop> 
    <prop key="hibernate.cache.provider_class"> 
    org.hibernate.cache.OSCacheProvider 
    </prop> 
    <prop key="hibernate.cache.use_second_level_cache"> 
    true 
    </prop> 
    <!-- <prop key="hibernate.hbm2ddl.auto">update</prop>--> 
    <!-- HIBERNATE CONNECTION POOLING!!--> 
    <prop key="c3p0.acquire_increment">5</prop> 
    <prop key="c3p0.idle_test_period">100</prop> 
    <!-- seconds -->  
    <prop key="c3p0.max_statements">5</prop> 
    <prop key="c3p0.min_size">15</prop> 
          <prop key="c3p0.max_size">100</prop> 
    <prop key="c3p0.timeout">100</prop> 
    <!-- seconds --> 
    </props> 
    </property> 

우리의 응용 프로그램이 봄 & 최대 절전 모드를 통해 개발되고있다.

응용 프로그램을 가져 와서 열면 140 개의 연결이 열리고 해제되지 않습니다.

우리의 DAO는 다음과 같습니다

import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 
... 
public class ActionDAO extends HibernateDaoSupport implements IActionDAO { 
public Action findById(ActionPK actionPK) { 
    return (Action) getHibernateTemplate().get(Action.class, actionPK); 
} 

public void add(Action action) { 
    getHibernateTemplate().save(action); 
} 
} 
+0

을 닫고 트랜잭션

  • 커밋 작업을 읽을 수행합니다. 한 주에 한 인터넷 검색 및 많은 포럼 게시 후에 문제를 파악할 수 없었습니다. 테스트 목적으로 2 차 레벨 캐시를 "false"로 설정하고 시스템이 작동합니다. Ehcache는 우리 프로젝트에서 사용됩니다. 나는 그 문제를 알아 내려고 노력하지만 여전히 나에 대해 퀴즈를 맺고있다. 그것을 시도해보십시오, 그것이 효과가 있을지 모릅니다. – Shashi

  • +0

    Hibernate의 버전은 무엇입니까 ?? – Shashi

    답변

    2

    우리는 전에도 비슷한 문제가 있었고 근본적인 원인은 응용 프로그램이 종료되기 전에 최대 절전 세션 팩토리가 닫히지 않았기 때문입니다. 이 작업을 자동으로 처리하기로되어있는 Spring을 사용하고 있다는 것을 알고 있지만, 여전히 점검 할 가치가있을 것입니다.

    1

    이 세션 트랜잭션의 일부인가? 그럴 경우 세션/연결 종료는 트랜잭션이 끝날 때만 발생할 수 있습니다. 그런 일이 발생하지 않으면 유출 된 연결을 받게됩니다.

    org.hibernate.jdbc 및 org.hibernate.transaction에서 디버그 로깅을 활성화하면 HibernateTemplate 클래스 (HibernateDaoSupport가 사용)를보고 세션 생성/닫기가 구성되는 방법에 대한 옵션을 볼 수 있습니다. DAO 객체를 Spring 트랜잭션 래퍼 (wrapper) 또는 비슷한 것으로 래핑하고 싶을 수도있다.

    +0

    이 블로그에서 매우 잘 설명되어 있습니다 - http://sschelter.blogspot.in/2009/12/forcing-use-of-transactional.html. 세션은 HibernateTransactionManager에 의해 관리된다. Transactional on 메소드 주석을 만나면 메소드 실행 후 자동으로 닫히는 새로운 Session이 생성됩니다. 이제 Transactional 주석이 없으면 HibernateDaoSupport의 getSession()을 호출하면 자동으로 새 세션이 만들어 지지만이 컨테이너는 컨테이너에 의해 관리되지 않으므로 개발자는 명시 적으로 닫아야합니다 – user3257644

    1

    귀하의 c3p0 설정이 100db 연결 이상인 것으로 보지 않습니다. 즉, idle_test_period를 c3p0 timeout보다 작은 값으로 설정해야한다고합니다.

    또한 c3p0이 사용되지 않는 이유를 결정하는 데 최대 절전 모드 버전이 중요합니다.

    당신은 또한 봄 언급했다; 당신은 거래와 관련하여 무엇을하고 있는지 알아야합니다. 어떤 종류의 서비스 나 귀하의 경우에 DAO를 트랜잭션으로 사용하지 않는 것이 있습니까?

    0

    유,

    당신은 HibernateTemplate에 하나 개 이상의 인스턴스를 생성되지 않도록하십시오 스프링에서 autowiring과 HibernateTemplate에를 사용하는 경우, 즉 개체 o 어딘가에 캐시 때 반환해야합니다

    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml"); 
    Object o=context.getBean("hibernateTemplate"); 
    

    귀하의 애플 리케이션 코드는 hibernatetemplate의 인스턴스를 요구하고 있습니다.

    감사

    0

    는 최소 크기를 삭제하고 시도 : 나는 Jboss-hibernate에서 유사한 문제가 있었다

    0

    c3p0.min_size. 트랜잭션 세션에서 의 연산을 수행하는 동안 트랜잭션을 커밋 할 필요가 없다는 인상을 받았습니다. 그러나 트랜잭션 opeartion (트랜잭션을 시작한 경우)이라고 읽었음에도이 커미트되어야 함을 알았습니다. 우리가 어디에서나 거래를 한 후에는 누출이 사라졌습니다.

    버기 코드는 다음과 같았다 :

    1. 세션

    위는 다음과 같은 절차로 대체하고, 누설이 사라졌다를 닫 읽기 동작을 실행

  • 을 거래
  • 을 시작합니다.
    1. 태초의 거래는
    2. 우리는 이전에 우리의 프로젝트에 같은 상황에 직면 세션
  • 관련 문제