【发布时间】:2010-12-25 17:25:15
【问题描述】:
在我的应用程序中,Spring 管理用于数据库访问的连接池。 Hibernate 使用这些连接进行查询。乍一看,我对池没有任何问题:它可以在并发客户端和只有一个连接的池中正常工作。我可以执行很多查询,所以我认为我(或 Spring)不会留下打开的连接。
我的问题出现在一段时间不活动后(有时 30 分钟,有时超过 2 小时)。然后,当 Hibernate 进行一些搜索时,它会持续太多。将 log4j 级别设置为 TRACE,我得到以下日志:
...
18:27:01 DEBUG nsactionSynchronizationManager - Retrieved value [org.springframework.orm.hibernate3.SessionHolder@99abd7] for key [org.hibernate.impl.SessionFactoryImpl@7d2897] bound to thread [http-8080-Processor24]
18:27:01 DEBUG HibernateTransactionManager - Found thread-bound Session [org.hibernate.impl.SessionImpl@8878cd] for Hibernate transaction
18:27:01 DEBUG HibernateTransactionManager - Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@1b2ffee]
18:27:01 DEBUG HibernateTransactionManager - Creating new transaction with name [com.acjoventut.service.GenericManager.findByExample]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
18:27:01 DEBUG HibernateTransactionManager - Preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@8878cd]
18:27:01 TRACE SessionImpl - setting flush mode to: AUTO
18:27:01 DEBUG JDBCTransaction - begin
18:27:01 DEBUG ConnectionManager - opening JDBC connection
在这里它会被冻结大约 2 到 10 分钟。但接着继续:
18:30:11 DEBUG JDBCTransaction - current autocommit status: true
18:30:11 DEBUG JDBCTransaction - disabling autocommit
18:30:11 TRACE JDBCContext - after transaction begin
18:30:11 DEBUG HibernateTransactionManager - Exposing Hibernate transaction as JDBC transaction [jdbc:oracle:thin:@212.31.39.50:30998:orcl, UserName=DEVELOP, Oracle JDBC driver]
18:30:11 DEBUG nsactionSynchronizationManager - Bound value [org.springframework.jdbc.datasource.ConnectionHolder@843a9d] for key [org.apache.commons.dbcp.BasicDataSource@7745fd] to thread [http-8080-Processor24]
18:30:11 DEBUG nsactionSynchronizationManager - Initializing transaction synchronization
...
之后,它可以正常工作,直到另一段不活动。恕我直言,似乎连接池返回了一个无效/关闭的连接,当 Hibernate 意识到这一点时,请求另一个连接池。
我不知道如何解决这个问题或我可以做些什么来划定它。实现这一目标的任何帮助将不胜感激。
谢谢。
编辑:嗯,最后是由于防火墙规则。数据库检测到连接丢失,但池(dbcp 或 c3p0)没有。因此,它尝试查询数据库但没有成功。对我来说仍然很奇怪的是超时时间是非常可变的。也许规则特别奇怪或防火墙无法正常工作。无论如何,我无法访问那台机器,我只能等待解释。 :(
【问题讨论】:
-
您如何确定这是否是防火墙问题?我面临着一个类似的问题,即 dbcp 在我的 Spring Batch 事务中无限期挂起并且永远不会返回
标签: java oracle hibernate spring jdbc