我正在使用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/