我正在使用Hibernate 4.2,JPA 2.0和Postgres 9.2

代码被卡在Persistence.createEntityManagerFactory("peristence_unit_name");
在进一步调查中,我发现Hibernate调用了getTypeInfo()类的java.sql.DatabaseMetaData方法。此方法尝试加载有关每个数据库对象的元数据

/**
 * Perform the extraction
 *
 * @param metaData The JDBC metadata
 *
 * @return The extracted metadata
 */
public static LinkedHashSet<TypeInfo> extractTypeInfo(DatabaseMetaData metaData) {
    LinkedHashSet<TypeInfo> typeInfoSet = new LinkedHashSet<TypeInfo>();
    try {
        ResultSet resultSet = metaData.getTypeInfo(); // << Gets stuck here.
        try {
             ......
getTypeInfo()的代码是Postgers的JDBC驱动程序的一部分,而确实是该驱动程序需要花费一些时间来执行该方法(我加载了驱动程序源并尝试了跟踪)。但是由于这个问题在Hibernate 3.3(我之前使用过)中没有发生,所以我认为Hibernate 3.3并未调用此方法,而Hibernate 4.2却调用了该方法。

有办法解决这个问题吗?注意,与Hibernate 3.3相同的设置可以正常工作。

额外信息:
驾驶员一直在做什么:

它首先获取数据库对象的列表,然后循环遍历结果集以获取每个对象的元数据。

数据库中大约有3000个对象(我有一个非常大的数据集,需要很多分区表。加上PostGIS拥有许多自己的对象)

每个对象查找大约需要1秒,因此大约需要3000秒才能完成调用。

最佳答案

我有同样的问题,由于某种原因,它需要很长时间才能提取JDBC元数据以进行 hibernate 。
您只需将jsbc元数据用于 hibernate 状态即可关闭,它将变得非常快。但是请记住, hibernate 状态不使用jdbc元数据,而是使用一些默认值。

要尝试此操作,请将hibernate.temp.use_jdbc_metadata_defaults设置为false。

 <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>

关于hibernate - Persistence.createEntityManagerFactory()需要很长时间才能返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23969399/

10-09 06:08
查看更多