entitymanager.close()没有关闭与数据库的连接

时间:2013-10-01 03:23:19

标签: java hibernate jpa c3p0

我正在开发一个测验系统,我是JPA&休眠。我已经使用了hibernate 4.2.3并且我使用了c3p0连接池。 代码工作正常,但每个EntityManager创建一个永不关闭的连接。一旦达到最大连接数,则应用程序无法访问数据库。 我正在使用MySQL 5.6.10,当我在工作台中看到连接时,我从未看到连接被破坏。应用程序不会重用连接。

我的猜测是连接不会返回到连接池。我不知道怎么写“manager.close()”。

hibernate内部连接池也是如此。 (如果我删除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;
    }

请指出我错在哪里。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我没有提交每笔交易。因此问题。