使用Hibernate时,Persistence.createEntityManager()非常缓慢

3
我正在使用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个回答

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

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


谢谢您的建议 - 不过,我已经尝试过不使用hbm2ddl,但似乎并没有什么太大的区别。下一步我可能会尝试使用另一个数据库。如果Hibernate和HSQLDB不能很好地配合,那将让我感到惊讶,因为它们都是JBoss生态系统的一部分。 - chris

0

如此长时间的延迟也可能是网络超时的迹象。根据this answer,Hibernate应该针对嵌入式XML模式的副本验证persistence.xml。也许由于某种原因它正在尝试从互联网获取XSD。您能否获取线程转储或更详细的配置文件,以确定实体管理器创建被卡住的原因?


这是一个有趣的建议 - 但似乎这不是问题所在。在 Eclipse 调试器中仔细检查线程转储后,EntityManager 似乎主要用于从 JAR 文件中加载类 - 包括我的实体(大约20个类)和像 Xerxes XML 解析类之类的东西 - 这不应该花费那么长的时间。我有一种感觉,这可能是 Eclipse RCP 类加载相关问题(这不是第一次)。 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接