6

私はクイズシステムを開発しています.JPAとHibernateは初めてです。私は hibernate 4.2.3 を使用し、c3p0 接続プーリングを使用しました。コードは正常に動作しますが、各 EntityManager は決して閉じられない接続を作成します。接続の最大数に達すると、アプリケーションはデータベースにアクセスできなくなります。私は MySQL 5.6.10 を使用しています。ワークベンチで接続を確認しても、接続が破棄されていることはありません。また、アプリケーションは接続を再利用していません。

私の推測では、接続は接続プールに返されません。「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;
    }

私が間違っているところを教えてください。

前もって感謝します。

4

1 に答える 1