Я разрабатываю систему викторины, и я новичок в 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;
}
Просьба указать мне, где я ошибаюсь.
Заранее спасибо.
вы начинаете транзакцию после выполнения запроса? – nachokk
@nachokk - это ошибка в копировании. Я начинаю транзакцию перед запросом. –
и не совершаете ли вы это? – nachokk