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

连接池问题

百里星纬
2023-03-14
问题内容

如果我在闲置了一段时间后启动应用程序,那么我曾经遇到以下错误。(我正在使用Spring + Hibernate + MySQL作为DB)

ERROR [org.hibernate.util.JDBCExceptionReporter]The last packet successfully received from the server was 74,188,684 milliseconds ago. 
The last packet sent successfully to the server was 74,188,685 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
org.hibernate.exception.JDBCConnectionException: could not execute query

我通过将以下内容添加到我的servlet-context.xml中解决了这个问题。

<beans:property name="validationQuery" value="SELECT 1"/>

我在这里问了这个问题,这个问题是解决方案所特有的。我需要知道为什么会遇到这个错误。

我尝试了上面链接中提供的第一个选项(使用autoReconnect =
true配置连接字符串)和第三个选项(配置连接池以测试连接的有效性),并且都可以使用。仍然我不明白为什么我首先遇到错误。

这是我更新的servlet-context.xml文件,我正在使用ApacheDBCP进行连接池。

<beans:bean id="MyID" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <beans:property name="url" value="jdbc:mysql://localhost:17761/myDB"/>
        <beans:property name="username" value="myname"/>
        <beans:property name="password" value="mypwd"/>
        <beans:property name="maxIdle" value="5"/>
        <beans:property name="maxActive" value="20"/>
        <beans:property name="minIdle" value="5"/>
        <beans:property name="validationQuery" value="SELECT 1"/>
</beans:bean>

是连接到期问题吗?请帮助我理解。


问题答案:

这是事件流,以说明正在发生的事情:

  1. 调用方(应用程序或连接池)请求并使用连接
  2. 调用方保留对其的引用,以便可以重新使用该连接
  3. 呼叫者会经历一段闲置时间(例如,一整夜的dev系统或一周末的QA系统)。
  4. 一旦不使用该数据库连接,数据库就会认为该连接处于空闲状态。由于它是空闲的,因此在一定时间(MySQL默认值为8小时)后,数据库将关闭连接。
  5. 调用方仍然具有该连接的句柄,并且当调用方再次尝试使用该连接时,它不愉快地发现该连接已关闭。

autoReconnect =
true起作用的原因以及测试连接有效性的池起作用的原因是,您正在指示调用系统针对这种情况测试连接,并在这种情况发生时再次尝试。

至于验证查询是否会影响性能:从理论上讲,它是使用连接来做某事。在实践中,某些事情是如此琐碎,以至于在整个系统的环境中其影响可以忽略不计。

[编辑]

在这种情况下,Apache
DBCP是挂在连接上的连接池,但是您不希望DBCP在每次调用后关闭连接。连接池的重点是使连接为下一次调用做好准备,因为创建连接非常昂贵。池维护的连接对象由实际的数据库连接支持,而数据库是在空闲超时时间后关闭该实际连接的数据库。请注意,关闭空闲连接的超时是在数据库上配置的,而不是在连接池上配置的。因此,除非DBCP实际上尝试与其连接,否则DBCP无法知道该连接是否已关闭。这就是为什么您需要验证查询的原因。

有关配置DBCP的更多信息,请参见配置页面和API文档。



 类似资料:
  • 我向websphere V7添加了一个新的数据源。0,它工作正常,但在一段不活动时间后,池将返回死连接,java将进入等待状态,直到连接超时过期。如果我转到datasource管理页面并“测试连接”,连接池将再次工作。 我注意到,我们的oracle db会不时地关闭连接。 您知道如何从java重新激活连接吗?是否有其他方法来对抗Websphere池中的死连接?

  • 我对连接池有一些疑问。在SQL Server连接池文章中提到的内容类似于“打开新连接时,如果连接字符串与现有池不完全匹配,则会创建一个新池。每个进程、每个应用程序域、每个连接字符串以及使用集成安全性时、每个Windows标识将连接池化。” 现在我有了自己的windows窗体应用程序,它具有SQL连接。 > 所以当我打开应用程序时,SQL连接首次打开,并创建了一个池。所以,如果我关闭应用程序池会被自

  • 作为一个专业的服务端开发工程师,我们必须要对连接池、线程池、内存池等有较深理解,并且有自己熟悉的库函数可以让我们轻松驾驭这些不同的 池子。既然他们都叫某某池,那么他们从基础概念上讲,原理和目的几乎是一样的,那就是 复用。 以连接池做引子,我们说说服务端工程师基础必修课。 从我们应用最多的 HTTP 连接、数据库连接、消息推送、日志存储等,所有点到点之间,都需要花样繁多的各色连接。为了传输数据,我们

  • 连接池是客户端内的一个对象,主要是维持现有节点的连接。理论上来讲,节点只有死节点与活节点。 然而在现实世界中,事情绝不会这么明确。有时候节点是处在 “可能挂了但还未确认” 、 “连接超时但未知原因” 或 “最近挂过但现在可用” 的灰色地带中。而连接池的工作就是管理这些无规则的连接,并为客户端提供最稳定的连接状态。 如果一个连接池找不到一个活节点来发送查询,那么就会返回一个 NoNodesAvail

  • Swoole 在 v4 版本后内置了 Library 模块,使用 PHP 代码编写内核功能,使得底层设施更加稳定可靠,并且提供了内置协程连接池,本章节会说明如何使用对应的连接池。 也可以观看Swoole微课程视频教程学习内置连接池的使用。 ConnectionPool ConnectionPool,原始连接池,基于Channel自动调度,支持传入任意构造器(callable),构造器需返回一个连接

  • 安装 composer require hyperf/pool 为什么需要连接池? 当并发量很低的时候,连接可以临时建立,但当服务吞吐达到几百、几千的时候,频繁 建立连接 Connect 和 销毁连接 Close 就有可能会成为服务的一个瓶颈,那么当服务启动的时候,先建立好若干个连接并存放于一个队列中,当需要使用时从队列中取出一个并使用,使用完后再反还到队列去,而对这个队列数据结构进行维护的,就