使用Hibernate,Persistence.createEntityManager()会慢慢变慢

时间:2011-02-17 18:17:48

标签: performance hibernate jpa hsqldb entitymanager

我的Eclipse RCP应用程序存在巨大的性能问题,显然是由Hibernate引起的。更具体地说,应用程序启动需要很长时间(最多2分钟) - 分析和调试表明创建Hibernate / JPA EntityManagerFactory(在启动时发生)需要很长时间。

我玩过很多设置,例如使用文件数据库而不是内存而不使用hbm2ddl,但没有成功。有没有人遇到过这样的问题?

我正在使用JDK 1.6.20,Hibernate 3.5和HSQLDB 1.8(内存配置)。

下面是我的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="my_db" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
            <!-- about 20 classes; skipped for brevity -->
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
            <property name="hibernate.connection.url" value="jdbc:hsqldb:mem:my_db"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
        </properties>
    </persistence-unit>    
</persistence>

2 个答案:

答案 0 :(得分:1)

        <property name="hibernate.hbm2ddl.auto" value="create-drop"/>

根据您拥有的实体数量,可能需要一些时间来创建所有表,索引和相似内容。我将更改为另一个DB(或非内存数据库),将create-drop替换为“create”,运行一次,完全删除该属性(以便它不会尝试创建已存在的表)和再次运行它。 最后一步更接近Hibernate花费的实际时间,而不是当前配置。

答案 1 :(得分:0)

如此长的延迟也可能是网络超时的标志。根据{{​​3}},hibernate应该针对xml架构的嵌入式副本验证persistence.xml。也许是出于某种原因试图从互联网上获取xsd。您是否可以获得线程转储或实体管理器创建被卡住的更详细的配置文件?