Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 休眠慢以获取Postgres连接_Java_Hibernate_Postgresql_Connection - Fatal编程技术网

Java 休眠慢以获取Postgres连接

Java 休眠慢以获取Postgres连接,java,hibernate,postgresql,connection,Java,Hibernate,Postgresql,Connection,我真的很难调试这个问题。每当我试图与博士后建立联系时,都需要整整一分钟的时间。建立连接后,一切正常。我尝试过禁用所有映射,不加载任何映射,但连接仍然需要很长时间才能获得。我也尝试过禁用验证,没有区别。当我使用一个简单的JDBC连接时,它是即时的。Hibernate正在做一些需要花费大量时间的事情,我似乎无法缩小范围。非常感谢您的任何意见 博士后司机: postgresql-9.1-901.jdbc4.jar 配置设置: <hibernate-configuration> &

我真的很难调试这个问题。每当我试图与博士后建立联系时,都需要整整一分钟的时间。建立连接后,一切正常。我尝试过禁用所有映射,不加载任何映射,但连接仍然需要很长时间才能获得。我也尝试过禁用验证,没有区别。当我使用一个简单的JDBC连接时,它是即时的。Hibernate正在做一些需要花费大量时间的事情,我似乎无法缩小范围。非常感谢您的任何意见

博士后司机:

postgresql-9.1-901.jdbc4.jar
配置设置:

<hibernate-configuration>
    <session-factory>
    <!-- properties -->
        <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property>
        <property name="connection.driver_class">org.postgresql.Driver</property>

        <property name="connection.url">jdbc:postgresql://xxxx.com:5432/xxxxx</property>
        <property name="connection.username">xxxxxxx</property>
        <property name="connection.password">xxxxxxx</property>

    </session-factory>
</hibernate-configuration>
以下是发生延迟的代码段:

private SessionFactory buildSessionFactory() throws Exception {
        ServiceRegistry serviceRegistry  = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();

            //Building session takes a whole minute without mappings!!!
        sessionFactory = config.buildSessionFactory(serviceRegistry);

        validateConnection();

        return sessionFactory;
    }
以下是日志结果:

[main] 2012-04-09 10:40:32,823 110391 INFO  C3P0ConnectionProvider - HHH000046: 
Connection properties: {user=hgaidb_test, password=****}
[main] 2012-04-09 10:40:32,823 110391 INFO  C3P0ConnectionProvider - HHH000006: 
Autocommit mode: false
[main] 2012-04-09 10:40:34,100 111668 DEBUG JdbcServicesImpl - Database ->
       name : PostgreSQL
    version : 8.3.3
      major : 8
      minor : 3
[main] 2012-04-09 10:40:34,101 111669 DEBUG JdbcServicesImpl - Driver ->
       name : PostgreSQL Native Driver
    version : PostgreSQL 9.1 JDBC4 (build 901)
      major : 9
      minor : 1
*******************************************************************************
// 1 MINUTE DELAY
*******************************************************************************
[main] 2012-04-09 10:40:34,102 111670 DEBUG JdbcServicesImpl - JDBC version : 4.
0
[main] 2012-04-09 10:41:21,632 159200 INFO  Dialect - HHH000400: Using dialect: 
org.hibernate.dialect.PostgreSQLDialect
*******************************************************************************
[main] 2012-04-09 10:41:21,669 159237 INFO  LobCreatorBuilder - HHH000424: Disab
ling contextual LOB creation as createClob() method threw error : java.lang.refl
ect.InvocationTargetException
[main] 2012-04-09 10:41:21,814 159382 DEBUG SettingsFactory - Automatic flush du
ring beforeCompletion(): disabled
[main] 2012-04-09 10:41:21,814 159382 DEBUG SettingsFactory - Automatic session 
close at end of transaction: disabled
[main] 2012-04-09 10:41:21,815 159383 DEBUG SettingsFactory - JDBC batch size: 3
0
[main] 2012-04-09 10:41:21,816 159384 DEBUG SettingsFactory - JDBC batch updates
 for versioned data: disabled
[main] 2012-04-09 10:41:21,816 159384 DEBUG SettingsFactory - Scrollable result 
sets: enabled
[main] 2012-04-09 10:41:21,817 159385 DEBUG SettingsFactory - Wrap result sets: 
disabled
[main] 2012-04-09 10:41:21,818 159386 DEBUG SettingsFactory - JDBC3 getGenerated
Keys(): enabled
[main] 2012-04-09 10:41:21,818 159386 DEBUG SettingsFactory - JDBC result set fe
tch size: 100
[main] 2012-04-09 10:41:21,819 159387 DEBUG SettingsFactory - Connection release
 mode: auto
[main] 2012-04-09 10:41:21,819 159387 INFO  TransactionFactoryInitiator - HHH000
399: Using default transaction strategy (direct JDBC transactions)
[main] 2012-04-09 10:41:21,844 159412 DEBUG SettingsFactory - Default batch fetc
h size: 1
[main] 2012-04-09 10:41:21,844 159412 DEBUG SettingsFactory - Generate SQL with 
comments: disabled
[main] 2012-04-09 10:41:21,845 159413 DEBUG SettingsFactory - Order SQL updates 
by primary key: disabled
[main] 2012-04-09 10:41:21,846 159414 DEBUG SettingsFactory - Order SQL inserts 
for batching: disabled
[main] 2012-04-09 10:41:21,846 159414 DEBUG SettingsFactory - Query translator: 
org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory
[main] 2012-04-09 10:41:21,867 159435 INFO  ASTQueryTranslatorFactory - HHH00039
7: Using ASTQueryTranslatorFactory
[main] 2012-04-09 10:41:21,867 159435 DEBUG SettingsFactory - Query language sub
stitutions: {}
[main] 2012-04-09 10:41:21,867 159435 DEBUG SettingsFactory - JPA-QL strict comp
liance: disabled
[main] 2012-04-09 10:41:21,868 159436 DEBUG SettingsFactory - Second-level cache
: enabled
[main] 2012-04-09 10:41:21,868 159436 DEBUG SettingsFactory - Query cache: disab
led
[main] 2012-04-09 10:41:21,869 159437 DEBUG SettingsFactory - Cache region facto
ry : org.hibernate.cache.internal.NoCachingRegionFactory
[main] 2012-04-09 10:41:21,872 159440 DEBUG SettingsFactory - org.hibernate.cach
e.internal.NoCachingRegionFactory did not provide constructor accepting java.uti
l.Properties; attempting no-arg constructor.
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Optimize cache for
 minimal puts: disabled
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Structured second-
level cache entries: disabled
[main] 2012-04-09 10:41:21,873 159441 DEBUG SettingsFactory - Statistics: disabl
ed
[main] 2012-04-09 10:41:21,874 159442 DEBUG SettingsFactory - Deleted entity syn
thetic identifier rollback: disabled
[main] 2012-04-09 10:41:21,874 159442 DEBUG SettingsFactory - Default entity-mod
e: pojo
[main] 2012-04-09 10:41:21,875 159443 DEBUG SettingsFactory - Named query checki
ng : enabled
[main] 2012-04-09 10:41:21,875 159443 DEBUG SettingsFactory - Check Nullability 
in Core (should be disabled when Bean Validation is on): enabled
[main] 2012-04-09 10:41:21,876 159444 DEBUG SettingsFactory - multi-tenancy stra
tegy : NONE
我对此做了更多的研究,逐步完成了调试器。我的类路径中没有所有的源代码,但是我仍然可以看到变量。在等待一分钟的过程中,Hibernate正在查询pg_catalog.pg_type表:

[SELECT typname FROM pg_catalog.pg_type WHERE oid = , ]
以下是一个屏幕截图:


这听起来有点像我们在RubyonRails中看到的问题。您可能会寻找与我在这里描述的类似的原因:

简言之,这个问题是由从多个类加载器上下文显式注册JDBC驱动程序引起的。

我修复了它=)我真的必须寻找这个问题的答案。基本上,它归结为加载元数据和JDBC驱动程序。它正在加载所有元数据,包括sql列旁边的注释和其他各种构造,这些操作都不需要。我不知道为什么默认情况下会打开此功能,但除非您明确需要,否则您绝对应该关闭此功能:

config.setProperty("hibernate.temp.use_jdbc_metadata_defaults","false");
立即连接

我能找到的唯一信息是代码:

    config.setProperty("hibernate.hbm2ddl.auto", hbm2ddlMode);
    //config.setProperty("hibernate.cache.use_query_cache", "true");
    config.setProperty("hibernate.cache.use_second_level_cache", "true");
    //config.setProperty("hibernate.cache.region.factory_class", "net.sf.ehcache.hibernate.EhCacheRegionFactory");
    config.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.EhCacheProvider");
    //config.setProperty("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider");
    config.setProperty("hibernate.jdbc.fetch_size", "100");
    config.setProperty("hibernate.jdbc.batch_size", "30");
    config.setProperty("hibernate.jdbc.use_scrollable_resultset", "true");
    config.setProperty("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");

    config.setProperty("hibernate.c3p0.acquire_increment", "1");
    config.setProperty("hibernate.c3p0.idle_test_period", "0");
    config.setProperty("hibernate.c3p0.min_size", "1");
    config.setProperty("hibernate.c3p0.max_size", "2");
    config.setProperty("hibernate.c3p0.timeout", "0");
    config.setProperty("javax.persistence.validation.mode", "none");
107     // 'hibernate.temp.use_jdbc_metadata_defaults' is a temporary magic value.
108     // The need for it is intended to be alleviated with future development, thus it is
109     // not defined as an Environment constant...
110     //
111     // it is used to control whether we should consult the JDBC metadata to determine
112     // certain Settings default values; it is useful to *not* do this when the database
113     // may not be available (mainly in tools usage).
114     boolean useJdbcMetadata = ConfigurationHelper.getBoolean( "hibernate.temp.use_jdbc_metadata_defaults", configValues, true );

我还必须启用hibernate.jdbc.use\u get\u generated\u key,否则身份生成策略会引发异常。在此之前,它会根据从数据库接收到的元数据自动启用。因此,我的整个解决方案是在persistence.xml中添加以下两行内容:


一台postgresql server可以包含多个数据库。不幸的是,您不能,这就是为什么jdbc驱动程序读取元数据需要很长时间

将这些数据库分离到不同的postgres服务器中,元数据读取的性能将得到提高


阅读。

我对可滚动的结果集有问题,因此我必须添加第三个参数,请参见下文:

<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<property name="hibernate.jdbc.use_get_generated_keys">true</property>
<property name="hibernate.jdbc.use_scrollable_resultset">true</property>
false
真的
真的

差不多7年后,这仍然是一个问题

关闭“temp”键会有所帮助,但逐个启用将自动配置的属性会造成麻烦(请参阅其他答案)

对于Oracle和Teradata,我没有注意到这样的减速,所以我深入挖掘,找到了最慢的部分:

在我的例子中,这个结果集有372行(类型)。然后,对于每个驱动程序,从 这会导致针对数据库的大量SQL语句


现在不知道如何加快速度,幸运的是它需要一次,然后被缓存。

这样的延迟可能是由DNS问题造成的,尝试在
连接中使用IP地址而不是域名。url
排除这种可能性。我尝试了IP,但在获取时间上仍然没有差异。另请参见:发布了一个问题(2014年)要休眠项目,请参阅。在撰写本文时,这个问题仍然存在。根据我的经验,这个真正有效的hibernate方言必须明确定义。否则它会在应用程序启动时导致失败(至少对于PostgreSQL 9.3和hibernate 4而言).SchemaUpdate可能会受到禁用的影响。在我将
false
添加到hibernate.cfg.xml之前,启动需要1.5分钟。谢谢你的提示!请参阅
org.hibernate.engine.jdbc.internal.jdbcservicesiml.configure(Map)
Spring Boot对我来说不起作用。我将其作为属性添加到application.properties中,它再次开始工作:
spring.jpa.properties.hibernate.temp.use\u jdbc\u metadata\u defaults=false
谢谢!与Hibernate 5.2、Spring Framework 4.3和PostgreSQL JDBC 4.2一起工作,了解传奇@CraigRinger造成麻烦的序列的更多详细信息。虽然只需要一次,但在开发过程中,这很烦人,因为我们需要等待很长时间才能看到我们所做的是否成功。
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<property name="hibernate.jdbc.use_get_generated_keys">true</property>
<property name="hibernate.jdbc.use_scrollable_resultset">true</property>