当前位置: 首页 > 面试题库 >

Hibernate中的c3p0死锁

红经亘
2023-03-14
问题内容

我是休眠的新手,已经开始使用C3P0作为休眠的连接池管理器,因为没有它,在与MySQL服务器没有联系8个小时之后,我遇到了超时问题。

切换到C3P0后,我最近遇到了死锁,我不确定它是如何发生的。我虽然显示了所有堆栈跟踪和配置

这是配置日志

Jan 27, 2017 5:56:23 PM com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
Jan 27, 2017 5:56:23 PM com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10]
Jan 27, 2017 5:56:23 PM com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.PoolBackedDataSource@28c81cce [ connectionPoolDataSource -> com.mchange.v2.c3p0.WrapperConnectionPoolDataSource@35af8b6c [ 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 -> 1hge14z9l1qg67m9nxywg8|c2db68f, idleConnectionTestPeriod -> 300, initialPoolSize -> 1, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 120, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 25, maxStatements -> 0, maxStatementsPerConnection -> 0, minPoolSize -> 1, nestedDataSource -> com.mchange.v2.c3p0.DriverManagerDataSource@2e47880e [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> 1hge14z9l1qg67m9nxywg8|1b765a2c, jdbcUrl -> jdbc:mysql://localhost/Pokemon_Blaze_Online_Dev, properties -> {user=******, password=******} ], preferredTestQuery -> select 1;, propertyCycle -> 0, statementCacheNumDeferredCloseThreads -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> 1hge14z9l1qg67m9nxywg8|7e276594, numHelperThreads -> 3 ]

这是我设置的属性

<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.max_size">25</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_statement">0</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

这是被锁定的线程之一的线程转储。

"Request Pool-0" #71 prio=5 os_prio=0 tid=0x000000002b2df800 nid=0x1d48 in Object.wait() [0x000000003113e000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1414)
    at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
    - locked <0x00000006c1b3c088> (a com.mchange.v2.resourcepool.BasicResourcePool)
    at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:682)
    at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:140)
    at org.hibernate.c3p0.internal.C3P0ConnectionProvider.getConnection(C3P0ConnectionProvider.java:90)
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:387)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:171)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:63)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:162)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:186)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:160)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1884)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1861)
    at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1838)
    at org.hibernate.loader.Loader.doQuery(Loader.java:909)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
    at org.hibernate.loader.Loader.doList(Loader.java:2553)
    at org.hibernate.loader.Loader.doList(Loader.java:2539)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
    at org.hibernate.loader.Loader.list(Loader.java:2364)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1682)
    at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380)
    at org.hibernate.internal.CriteriaImpl.uniqueResult(CriteriaImpl.java:402)
    at com.game.server.persistence.services.player.PlayerDataServiceImpl.areValidCredentials(PlayerDataServiceImpl.java:28)
    at com.game.server.manager.request.service.DefaultLoginService.login(DefaultLoginService.java:78)
    at com.game.server.manager.request.DefaultRequestManager.lambda$login$2(DefaultRequestManager.java:103)
    at com.game.server.manager.request.DefaultRequestManager$$Lambda$63/869031346.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

   Locked ownable synchronizers:
    - <0x000000079eea0890> (a java.util.concurrent.ThreadPoolExecutor$Worker)

由于我对此并不陌生,因此无法从日志和转储中识别问题。我还注意到C3P0创建了很多线程

enter image description
here


问题答案:

您的应用程序几乎肯定会泄漏连接。有关如何调试问题,请参见c3p0的文档。

TL; DR:设置

<property name="hibernate.c3p0.unreturnedConnectionTimeout">30</property>
<property name="hibernate.c3p0.debugUnreturnedConnectionStackTraces">true</property>

Check your logs for stack traces that check out Connections or Sessions in
your application but fail to reliably close() them. Fix that, by using
something like try-with-resources to reliably close things. When you have
fixed the problem, remove the above properties.


See also this



 类似资料:
  • 问题内容: MySQL似乎在其连接上有8个小时的超时。我正在使用Hibernate for ORM在Tomcat中运行多个WAR。8小时(即通宵)后,当它拾取空闲连接时,管道破裂。 我已经遍历了代码,并确保我提交或回滚了所有事务。 这是我的hibernate.cfg.xml 我认为可以解决的参数是--默认为0。但是,运行8小时后,我们仍然遇到断管问题。尽管有多个通过Google发布的帖子索引,但没

  • 除非我真的很沮丧,否则我不会发这个帖子。我试图在一个非常简单的应用程序中用Hibernate 4.1.1配置C3P0,但是我得到了一个类未找到异常。我已经在类路径中包含了C3P0特定的jar文件。Hibernate-c3p0-3.5.2-Final.jar hibernate.properties: Stacktrace:

  • 问题内容: 我有一个使用Hibernate作为JPA提供程序的Spring / JPA应用程序。我已经通过以下方式在Spring中配置了C3P0数据源: 然后,我在Spring实体管理器工厂中指定了此数据源,如下所示: 但是,我最近在浏览Maven工件时注意到“ hibernate-c3p0”。这是什么?这是我需要使用的东西吗?还是我已经正确配置了它? 问题答案: hibernate-c3p0.j

  • C3P0不会在事务完成后释放连接。下面是堆栈跟踪: 池配置和事务配置如下: 如有任何建议,我将不胜感激

  • 问题内容: 我了解到要在hibernate中配置c3p0池,我们可以在hibernate.cfg.xml中编写如下配置: 但是我使用Spring配置了Hibernate。当我尝试执行以下操作时,它将无法正常工作: 我已经阅读了有关使用独立c3p0池的信息,该池可以使用Spring进行配置,但是有什么方法可以使用Spring在Hibernate中配置内置c3p0池呢? 启发我,因为我是初学者。 问题

  • 问题内容: 好吧,我正在尝试使用JPA + Hibernate + Spring首次配置C3P0。在persistence.xml中,我有: 但是,当我尝试初始化tomcat时,出现以下错误: 编辑1: 这是我的applicationContext.xml,如何在其中配置C3P0呢? 问题答案: 您的配置有缺陷。您正在应用程序上下文中进行配置。因此,基本上所有属性都是无用的,其次,该属性的设置破坏