2013-10-01 2 views
4

퀴즈 시스템을 개발 중이며 JPA & Hibernate를 처음 사용합니다. 나는 최대 절전 모드 4.2.3을 사용했고 나는 c3p0 연결 풀링을 사용했다. 코드는 정상적으로 작동하지만 각 EntityManager는 절대로 닫히지 않는 연결을 만듭니다. 최대 연결 수에 도달하면 응용 프로그램은 데이터베이스에 액세스 할 수 없습니다. MySQL 5.6.10을 사용하고 있는데, 연결이 끊어지는 것을 결코 볼 수없는 워크 벤치에서 연결을 볼 수 있습니다. 그리고 응용 프로그램은 연결을 재사용하지 않습니다.entitymanager.close()가 데이터베이스 연결을 닫지 않음

내 생각에 연결이 연결 풀로 반환되지 않습니다. 나는 어떻게 "manager.close()"라고 쓰는지 모르겠다.

최대 절전 모드 내부 연결 풀링에서도 마찬가지입니다. (여기서 I는 C3P0을 제거한다.) 여기서

"의 persistence.xml"의 속성이다

여기
<property name="hibernate.connection.provider_class" value="org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider" /> 
<property name="hibernate.c3p0.max_size" value="10" /> 
<property name="hibernate.c3p0.min_size" value="2" /> 
<property name="hibernate.c3p0.acquire_increment" value="1" /> 
<property name="hibernate.c3p0.idle_test_period" value="5000" /> 
<property name="hibernate.c3p0.max_statements" value="20" /> 
<property name="hibernate.c3p0.timeout" value="500" /> 

가 나는 데이터베이스에 액세스하는 방법의 EntityManagerFactory 여기

public class EntityMangFactory { 

    private static EntityManagerFactory emf=null; 

    private static void initEntityManagerFactory() 
    { 
     emf=Persistence.createEntityManagerFactory("com.oes.jpa"); //persistence-unit-name// 

    } 

    public static EntityManagerFactory getEntityManagerFactory() 
    { 
     if(emf==null){ 
      initEntityManagerFactory(); 
     } 
     return emf; 
    } 


} 

인 접근 방법이다.

public static List<MarksDTO> getMarks(int id){ 

     EntityManagerFactory factory= EntityMangFactory.getEntityManagerFactory(); 
     EntityManager manager= factory.createEntityManager(); 
     manager.getTransaction().begin(); 
     TypedQuery<MarksDTO> q= manager.createQuery("select new com.examsystem.DTO.MarksDTO(m.courseId,m.score,m.setNo,m.courseName) from MarksBean as m where TraineeID=:TraineeID",MarksDTO.class); 
     q.setParameter("TraineeID", id); 
     List<MarksDTO> ls=q.getResultList(); 


     manager.close(); 

     return ls; 
    } 

내가 잘못한 부분을 지적하십시오.

미리 감사드립니다.

+0

쿼리를 수행 한 후에 트랜잭션을 시작 하시겠습니까? – nachokk

+0

@nachokk - 그건 대처의 실수입니다. 쿼리 전에 트랜잭션을 시작합니다. –

+0

그리고 커밋합니까? – nachokk

답변

1

나는 각 거래를 커밋하지 않았습니다. 그러므로 문제.