2013-10-01 4 views
4

Я разрабатываю систему викторины, и я новичок в JPA & Hibernate. Я использовал hibernate 4.2.3, и я использовал пул соединений c3p0. Код работает нормально, но каждый EntityManager создает соединение, которое никогда не закрывается. И как только максимальное количество соединений будет достигнуто, приложение не сможет получить доступ к базе данных. Я использую MySQL 5.6.10, когда вижу соединения в workbench, я никогда не вижу разрушаемых соединений. И приложение не использует повторно соединения.entitymanager.close() не закрывает соединения с базой данных

Я предполагаю, что соединения не возвращаются в пул соединений. Я не знаю, как написал «manager.close()».

То же самое происходит с объединением внутренних подключений в спящем режиме. (В случае, если я удалить 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

Я не совершал каждую транзакцию. Отсюда и проблема.

Смежные вопросы