在我的应用程序中,Spring管理连接池以访问数据库。 Hibernate使用这些连接进行查询。乍一看,我对池没有任何问题:它对并发客户端和只有一个连接的池正常工作。我可以执行很多查询,所以我认为我(或Spring)不会保留打开的连接。连接在闲置之后挂起
我的问题出现一段时间后不活动(有时30分钟,有时超过2小时)。然后,当Hibernate进行一些搜索时,它会持续太久。 Log4j级别设置追查,我得到这个日志:
...
18:27:01 DEBUG nsactionSynchronizationManager - Retrieved value [[email protected]] for key [[email protected]] bound to thread [http-8080-Processor24]
18:27:01 DEBUG HibernateTransactionManager - Found thread-bound Session [[email protected]] for Hibernate transaction
18:27:01 DEBUG HibernateTransactionManager - Using transaction object [org.springframework.orm.hi[email protected]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 [[email protected]]
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 [[email protected]] for key [[email protected]] to thread [http-8080-Processor24]
18:30:11 DEBUG nsactionSynchronizationManager - Initializing transaction synchronization
...
之后,它的工作没有问题,直到另一个不活动的时期。恕我直言,它似乎像连接池返回一个无效/关闭连接,当Hibernate意识到这一点时,要求另一个连接池。
我不知道我该如何解决这个问题,或者我可以用它来分隔它。任何帮助实现这一点将不胜感激。
谢谢。
编辑:嗯,它最终是由于防火墙的规则。数据库检测到连接丢失,但池(dbcp或c3p0)不是。所以,它试图查询数据库没有成功。对我来说仍然很奇怪的是,超时时间非常多变。也许这个规则特别奇怪,或者防火墙无法正常工作。无论如何,我无法访问该机器,我只能等待解释。 :(
你是如何确定这是否是防火墙的问题?我遇到了一个类似的问题,其中dbcp无限期地挂在我的Spring Batch事务上,并且永远不会返回 – YogendraJ 2016-05-20 05:06:31