我无法确定为什么在我的Hibernate应用程序中初始化c3p0连接池需要2分钟。
这是在我的Hibernate.cfg.xml中:
<hibernate-configuration> <session-factory> <property name="connection.driver_class">org.postgresql.Driver</property> <property name="connection.url"/> <property name="connection.default_schema"/> <property name="connection.username"/> <property name="connection.password"/> <property name="dialect">org.hibernate.dialect.PostgreSQLDialect</property> <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property> <property name="current_session_context_class">thread</property> <property name="hibernate.c3p0.acquire_increment">1</property> <property name="hibernate.c3p0.min_size">3</property> <property name="hibernate.c3p0.max_size">10</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property> <property name="hibernate.c3p0."></property> <property name="show_sql">true</property> <property name="format_sql">false</property> <property name="hbm2ddl.auto">create</property> </session-factory> </hibernate-configuration>
构建会话工厂时,连接设置在我的HibernateUtil文件中设置。
当测试中的第一个事务为openend时,池将初始化。之后,连接和查询数据库就可以正常工作,它在开始之前仅在以下行上挂起一会儿。我对输出进行了格式化,因为我认为问题可能出在这里提到的一种设置。:
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@30670080 [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@ecfec4d0 [ acquireIncrement -> 1, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> I-REMOVED-THIS, idleConnectionTestPeriod -> 3000, initialPoolSize -> 3, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 300, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 10, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 3, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@b17e5c65 [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> I-REMOVED-THIS, jdbcUrl -> jdbc:postgresql://URL-TO-MY_DB, properties -> {user=******, password=******, default_schema=} ], preferredTestQuery -> null, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> I-REMOVED-THIS, numHelperThreads -> 3 ]
这是我第一次使用Hibernate和c3p0,我期望启动池时它会更快吗?这是我的误解吗?
使用远程数据库和本地PostgreSQL实例之间没有区别。
(编辑:这是不正确的。在比较本地和远程数据库服务器时,我犯了一个错误。在本地,初始化几乎是立即的,而在远程则需要大约2分钟。)
Edit2:这是连接过程的日志。
在会话工厂的配置中,将属性Hibernate.temp.use_jdbc_metadata_defaults设置为false。这将指示Hibernate使用元数据方言而不是连接,这将导致启动缓慢。您还必须为驱动程序配置适当的方言。