我正在使用Hibernate 4.2,JPA 2.0和Postgres 9.2
代码卡在 Persistence.createEntityManagerFactory("peristence_unit_name");
Persistence.createEntityManagerFactory("peristence_unit_name");
在进一步调查中,我发现Hibernate调用getTypeInfo()了java.sql.DatabaseMetaDataclass 方法。此方法尝试加载有关每个数据库对象的元数据
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。
hibernate.temp.use_jdbc_metadata_defaults
<prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>