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

闲置时间后连接挂起

芮瑾瑜
2023-03-14
问题内容

在我的应用程序中,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)未丢失。因此,它尝试查询数据库没有成功。我仍然感到奇怪的是,超时期限是非常可变的。也许规则特别奇怪,或者防火墙无法正常工作。无论如何,我无权访问该计算机,我只能等待解释。:(


问题答案:

当数据库位于单独的盒子上并且之间有防火墙设置为超时空闲连接时,我曾遇到过类似的问题。

在某些情况下,防火墙以JDBC端无法检测到的方式切断连接,尝试使用它会导致不确定的阻塞。

在我的情况下,这是一个自定义连接池,该连接池在从连接池返回连接之前先向连接发送了一个测试查询。我将此测试查询配置为具有超时(使用Statement.setQueryTimeout),以便它不会无限期地阻塞。



 类似资料:
  • 我正在使用HIkariCP,Hibernate和MySQL。问题是:当应用程序启动时,一切正常。但是当我让它闲置一段时间,然后返回并尝试从Hikari获得连接时,它会抛出异常: MySQL数据库位于外部服务器中,它有一些超时/会话过期功能,我无法更改。我认为这个问题正是由于太长的非活动时间导致的某种会话过期(因为只有在应用程序空闲一段时间后,问题才会发生)。这可能是由类似的问题,我不知道什么是确切

  • 在 Apache HttpClient 4.3 版本上配置连接空闲超时的最短方法是什么? 我看了文档,什么也找不到。我的目标是将开放连接减少到最小的服务器峰值。 例如,在Jetty客户端8. x中,您可以设置httpClient.setIdleTimeout:http://download.eclipse.org/jetty/stable-8/apidocs/org/eclipse/jetty/c

  • 检测空闲连接和超时是为了及时释放资源。常见的方法发送消息用于测试一个不活跃的连接来,通常称为“心跳”,到远端来确定它是否还活着。(一个更激进的方法是简单地断开那些指定的时间间隔的不活跃的连接)。 处理空闲连接是一项常见的任务,Netty 提供了几个 ChannelHandler 实现此目的。表8.4概述。 Table 8.4 ChannelHandlers for idle connections

  • null 如果我理解正确的话,我们应该在启动时有1个空闲连接,根据负载从0到3,对吗? 正在发生的情况是:启动时1个连接,如果负载较低,最多3个空闲连接,高负载后超过3个空闲连接。然后这些连接不会立即关闭,我们不知道它们何时/是否会关闭(有时它们中的一些会关闭)。 所以问题是:这种行为正常吗? DAO子类的使用示例:

  • 我在OS X 10.9.5上使用MySQL Workbench 6.3来管理多个云数据库(托管在Rackspace上),我遇到了以下问题: 闲置5分钟后,会出现以下问题: 我无法运行任何查询(错误 2013:查询期间失去与 MySQL 服务器的连接) 尝试浏览数据库上的表时,我收到诸如“无法获取表”、“无法获取视图”等消息 刷新左侧面板时,出现“错误代码:2006 MySQL服务器已消失” 所以基

  • 我正在使用带有连接池的reactor-netty http客户端(0.7.X系列),我想配置池连接的空闲超时,但不知道在哪里。 更准确地说,我需要配置reactor-netty http客户端连接池,使其能够自动关闭在可配置超时内未看到任何活动的连接。这些连接是开放的,但在一段(可配置的)时间内没有传输字节。 如何配置reactory-netty超文本传输协议客户端抢先关闭空闲连接?