0

私は休止状態にかなり慣れていません。Hibernate と JPA を使用してプログラムを作成しました。問題は、Persistence.createEntityManagerFactory("name") を呼び出すと、EntityManagerFactory を返すのに少なくとも 3000 ミリ秒 (または 8000 ミリ秒) かかることです。

私の PersistenceCtrl からのコードは次のとおりです。

import javax.persistence.*;

public class PersistenceCtrl {

private EntityManager entityManager;
private EntityManagerFactory entityManagerFactory;

public PersistenceCtrl() {
    startPersistenceCtrl();
}

public EntityManager getEntityManager() {
    return entityManager;
}

public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}

public EntityManagerFactory getEntityManagerFactory() {
    return entityManagerFactory;
}

public void setEntityManagerFactory(EntityManagerFactory entityManagerFactory) {
    this.entityManagerFactory = entityManagerFactory;
}

public void startPersistenceCtrl(){
    this.setEntityManagerFactory(Persistence.createEntityManagerFactory("name"));
    this.setEntityManager(this.getEntityManagerFactory().createEntityManager());        
}

public void closePersistenceCtrl(){
    //EntityTransaction et = this.getEntityManager().getTransaction();
    //et.begin();
    //this.getEntityManager().flush();
    //et.commit();
    this.getEntityManager().close();
    this.getEntityManagerFactory().close();
}

public void saveObject(Object obj){
    EntityTransaction et = this.getEntityManager().getTransaction();
    et.begin();

    this.getEntityManager().persist(obj);

    et.commit();
}

public void removeObject(Object obj){
    EntityTransaction et = this.getEntityManager().getTransaction();
    et.begin();

    this.getEntityManager().remove(obj);

    et.commit();
}

}

私のpersistence.xmlは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
             version="2.0">
    <persistence-unit name="name">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <!-- My classes -->

    <properties>
        <property name="hibernate.validator.apply_to_ddl" value="false"/>
        <property name="hibernate.validator.autoregister_listeners" value="false"/>
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
        <property name="javax.persistence.validation.mode" value="ddl"/>
        <property name="javax.persistence.jdbc.url" value="url"/>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.user" value="user"/>
        <property name="javax.persistence.jdbc.password" value="password"/>
        <property name="javax.persistence.jdbc.initialSize" value="2"/>
        <property name="javax.persistence.jdbc.minIdle" value="0"/>
        <property name="javax.persistence.jdbc.maxActive" value="10"/>
        <!-- <property name="hibernate.hbm2ddl.auto" value="update"/> -->
        <!-- <property name="javax.persistence.jdbc.minEvictableIdleTimeMillis" value="120000"/> -->
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
    </properties>
</persistence-unit>

これは正常ですか?

代わりに Hibernate から SessionFactory を使用する方が高速ですか?

ありがとうございました。

4

1 に答える 1

2

EntityManagerFactory は、スレッドセーフなオブジェクトであり、アプリケーションの存続期間中に一度だけ作成する必要があります。作成に 3 秒かかっても問題ありません。

EntityManagerFactory を閉じて、あなたがしているように再び開く理由はありません。

于 2012-05-21T18:13:54.950 に答える