Persistence.createEntityManagerFactory()需要很长时间才能返回

发布于 2021-02-01 12:33:39

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

代码卡在 Persistence.createEntityManagerFactory("peristence_unit_name");

在进一步调查中,我发现Hibernate调用getTypeInfo()java.sql.DatabaseMetaDataclass
方法。此方法尝试加载有关每个数据库对象的元数据

/**
 * 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秒才能完成调用。

关注者
0
被浏览
93
1 个回答
  • 面试哥
    面试哥 2021-02-01
    为面试而生,有面试问题,就找面试哥。

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

    要尝试将此设置hibernate.temp.use_jdbc_metadata_defaults为false。

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


推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看