出于某种原因,我的hibernate应用程序的启动速度非常慢。 (最多2分钟) 我一直认为c3p0配置是完全错误的(related question)但是研究日志表明,在建立与服务器的连接之后就没有活动了。此外,使用Hibernate的内置轮询功能也会显示相同的结果。
以下是日志的摘录:
20:06:51,248 DEBUG BasicResourcePool:422 - decremented pending_acquires: 0
20:06:51,248 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:06:51,248 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:06:51,273 DEBUG JdbcServicesImpl:121 - Database ->
name : PostgreSQL
version : 9.1.6
major : 9
minor : 1
20:06:51,274 DEBUG JdbcServicesImpl:127 - Driver ->
name : PostgreSQL Native Driver
version : PostgreSQL 9.2 JDBC4 (build 1002)
major : 9
minor : 2
20:06:51,274 DEBUG JdbcServicesImpl:133 - JDBC version : 4.0 ##### HANGS FOR 2 MINUTES ON THIS LINE #####
20:08:14,727 INFO Dialect:123 - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
20:08:14,736 INFO LobCreatorBuilder:120 - HHH000424: Disabling contextual LOB creation as createClob() method threw error : java.lang.reflect.InvocationTargetException
20:08:14,736 DEBUG GooGooStatementCache:297 - checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 0; checked out: 0; num connections: 0; num keys: 0
20:08:14,736 DEBUG GooGooStatementCache:297 - checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 0; checked out: 0; num connections: 0; num keys: 0
20:08:14,883 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:08:14,883 DEBUG BasicResourcePool:1644 - trace com.mchange.v2.resourcepool.BasicResourcePool@1acaf0ed [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@5f873eb2)
20:08:14,883 DEBUG GooGooStatementCache:297 - checkinAll(): com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats -- total size: 0; checked out: 0; num connections: 0; num keys: 0
(请注意#comment#。)
我还尝试了一个较旧的Postgres JDBC驱动程序,但没有任何运气。
连接到本地数据库工作得很好。立即建立连接,我可以查询数据库。这个远程数据库是一个Heroku开发实例。我也尝试了另一个遥控器。同样的结果。
我想出了我现在可以检查的想法,以摆脱这种烦恼。任何帮助将不胜感激。
也许我的hibernate.cfg.xml很有帮助:
http://www.hibernate.org/dtd/hibernate-
configuration-3.0.dtd">
<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">3</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.acquireRetryDelay">500</property>
<property name="show_sql">true</property>
<property name="format_sql">false</property>
<property name="hbm2ddl.auto">validate</property>
<mapping class="core.entities.Exam" />
<mapping class="core.entities.Examination" />
...
</session-factory>
</hibernate-configuration>
编辑:我试图通过日志和分析找到延迟的原因,但是它已经广泛失败了。 (虽然我在这方面不是那么先进。)最后我确实尝试了失败并改变了我的数据库以获取远程MySQL实例以检查是否存在任何差异。事实证明,连接几乎立即建立。
答案 0 :(得分:34)
请参阅Hibernate Slow to Acquire Postgres Connection
hibernate.temp.use_jdbc_metadata_defaults=false
避免在创建SessionFactory期间重新加载元数据。
答案 1 :(得分:5)
对于Postgres,添加应用程序配置:
spring.jpa.database-platform = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
如果不确定Dialect
,则需要第一行<强>结果
之前:
09:10:19.637 [main] INFO o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
09:14:17.159 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQL9Dialect
~4分钟
后:
09:40:10.930 [main] INFO o.h.annotations.common.Version - HCANN000001: Hibernate Commons Annotations {4.0.5.Final}
09:40:11.043 [main] INFO org.hibernate.dialect.Dialect - HHH000400: Using dialect: org.hibernate.dialect.PostgreSQLDialect
~1分钟
答案 2 :(得分:1)
如果异常缓慢,那么您的应用程序或某些资源块可能已锁定。在任何情况下,下载VisualVM(JDK包括jconsole,它的dumbed版本)并检查你的线程正在做什么,它们被卡住的地方(threaddump),如果没有给出任何快速答案,请打开探查器。
答案 3 :(得分:1)
你在用什么容器? c3p0应该安装在容器中,例如Tomcat。如果您正在运行单元测试,对于chrissakes,请不要使用连接池。如果将其放入tomcat,则使用Resource标记执行此操作,然后使用JNDI连接到它。最佳方式。
答案 4 :(得分:1)
启动缓慢可能是由以下配置引起的:
import esda
import libpysal.weights as lp
wq = lp.Rook.from_dataframe(result)
wq.transform = 'r'
y = result['consumption']
li = esda.moran.Moran_Local(y, wq)
此配置意味着在休眠启动时,检查实体是否与ddl匹配,并执行“创建”,“更新”之类的操作。这将花费太多时间。
因此解决方案是注释此配置。然后休眠将在没有验证的情况下开始。
答案 5 :(得分:1)
当我将数据库从 10g 更新到 11 时,我遇到了这个问题。 我在代码中发现了以下设置:
hibernateProperties.setProperty("hibernate.dialect","org.hibernate.dialect.Oracle10gDialect");
不得不改变方言如下:
hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle11gDialect");
一度这对我不再有效,我不得不更改以下内容以免卡在“HHH000400:使用方言:org.hibernate.dialect.Oracle10gDialect”:
hibernateProperties.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");
此外,我必须注释掉以下内容,以免卡在“HV000001:Hibernate Validator 6.1.5.Final”:
// hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "validate");