Hibernate速度慢,无法获取Postgres连接

我在调试此问题时非常困难。每当我尝试与postgres建立连接时,都需要花费一分钟的时间。建立连接后,一切正常。我尝试禁用所有映射并且不加载任何映射,但是仍然需要花费很长时间来获取连接。我也尝试过禁用验证,没有区别。当我使用简单的简单JDBC连接时,它是瞬时的。Hibernate所做的事情需要花费大量时间,而我似乎无法缩小范围。任何输入,不胜感激!

Postgres驱动程序:

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>

代码中的其他设置:

    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

我对此进行了更多的研究,逐步调试器。我的类路径中没有所有源代码,但仍然可以看到变量。等待一分钟后,Hibernate正在查询pg_catalog.pg_type表:

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

回答:

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

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

立即连接!

我可以找到的唯一信息是在代码中:

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速度慢,无法获取Postgres连接 的全部内容, 来源链接: utcz.com/qa/409704.html

回到顶部