hibernate缓慢以获取Postgres连接

我很难debugging这个问题。 每当我尝试与postgresbuild立连接时,都需要一整分钟的时间。 连接build立后,一切都很好。 我已经尝试禁用所有的映射,不加载任何,但仍然需要很长的时间来获取连接。 我也试过禁用validation,没有区别。 当我使用一个简单的JDBC连接时,它是即时的。 Hibernate正在做一些需要相当多的时间,我似乎无法缩小它。 任何input,非常感谢!

Postgres驱动程序:

postgresql-9.1-901.jdbc4.jar 

configuration设置:

 <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> 

代码中的其他设置:

  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"); 

以下是发生延迟的代码段:

 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 

我已经做了一些更多的研究,逐步debugging。 我没有在我的类path中的所有来源,但我仍然可以看到variables。 如果等待一分钟,Hibernate正在查询pg_catalog.pg_type表:

 [SELECT typname FROM pg_catalog.pg_type WHERE oid = , ] 

这里有一个截图:

DebugWindow

我修正了=)我真的不得不根本find这个答案。 基本上,它归结为加载元数据和JDBC驱动程序。 它正在加载所有的元数据,包括注释旁边的sql列和其他各种结构,这是不需要的操作。 我不知道为什么这是默认情况下,但你一定要closures这个function,除非你明确需要它:

 config.setProperty("hibernate.temp.use_jdbc_metadata_defaults","false"); 

立即连接!

我能find的唯一信息是在代码中:

 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 ); 

http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/hibernate-core/4.1.1.Final/org/hibernate/engine/jdbc/internal/JdbcServicesImpl.java#JdbcServicesImpl

我还必须启用hibernate.jdbc.use_get_generated_keys否则身份生成策略抛出exception。 在基于从DB接收的元数据自动启用之前。 所以我的整个解决scheme是添加以下两行到persistence.xml:

 <property name="hibernate.jdbc.use_get_generated_keys" value="true" /> <property name="hibernate.temp.use_jdbc_metadata_defaults" value="false" /> 

一个postgresql服务器可以包含多个数据库。 不幸的是,你不能隐藏其他数据库元数据到一个连接 ,这就是为什么阅读元数据需要很长时间的jdbc驱动程序!

将这些数据库分成不同的postgres服务器,提高元数据读取的性能!

阅读如何分离centos 。

这听起来很模糊,就像我们在Ruby on Rails中看到的一个问题。 你可能会寻找一个类似于我在这里描述的原因:

http://archives.postgresql.org/pgsql-performance/2009-11/msg00128.php

简而言之,这个问题是由多个ClassLoader上下文中的JDBC驱动程序的显式注册引起的。