druid之连接空闲超时问题FIX

这篇具有很好参考价值的文章主要介绍了druid之连接空闲超时问题FIX。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

彼时的少年站在成长的尽头,回首过去,一路崎岖早已繁花盛开

druid 是一个用于 Java 的高效数据库连接池,它提供了强大的监控和扩展功能。

空闲等待超时

Caused by:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:The last packet successfully received from the server was 65,699,330 milliseconds ago. The last packet sent successfully to the server was 65,699,330 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. 

mysql数据库等待超时时间(wait_timeout)是28800,也就是8小时,而druid连接池参数max-wait是30000

连接空闲超时问题的原因通常与连接池和数据库服务器之间的配置不匹配有关。当连接池中的连接长时间处于空闲状态时,数据库服务器可能会关闭这些空闲连接以节省资源。这种情况下,连接池可能仍然认为这些连接是有效的,但实际上数据库服务器已经释放了它们。

以下是引发连接空闲超时问题的一些可能原因:

  1. 服务器端的 wait_timeout 设置较低:数据库服务器会在连接空闲一段时间后关闭它们。如果服务器的 wait_timeout 参数设置得较低,连接池中的空闲连接可能在被使用前就已被服务器关闭。

  2. 连接池配置不合理:如果连接池的配置参数(例如 maxIdleminEvictableIdleTimeMillis)没有合理设置,连接池可能会保持过多的空闲连接,导致它们在被使用前被数据库服务器关闭。

  3. 连接池没有检查连接有效性:如果连接池在获取连接时没有进行有效性检查(例如没有启用 testOnBorrow 和设置 validationQuery),则可能会将已被数据库服务器关闭的连接分配给应用程序,从而导致通信问题。

解决这个问题的关键是确保连接池和数据库服务器之间的配置相互协调。可以通过调整连接池和数据库服务器的相关参数以及启用连接有效性检查来解决连接空闲超时问题。

解决方案

这个错误表明在使用数据库连接时出现了通信问题。从错误日志来看,连接在一段时间内没有收到或发送任何数据包,超过了服务器配置的 wait_timeout 值。这可能是因为连接长时间处于空闲状态,而 MySQL 服务器端的 wait_timeout 参数设置为 8 小时(28,800 秒)。

为了解决这个问题,可以尝试以下几个方法:

  1. 在 druid 连接池中配置 testOnBorrow 参数,将其设置为 true。这将在从连接池获取连接时检查连接的有效性。另外,你需要配置 validationQuery 参数,以便在获取连接时执行一个简单的 SQL 查询以测试连接的有效性。例如,对于 MySQL,可以设置 validationQuerySELECT 1
druid:
  testOnBorrow: true
  validationQuery: SELECT 1

  1. 调整 druid 连接池的 maxIdleminEvictableIdleTimeMillis 参数。maxIdle 参数用于设置连接池中允许的最大空闲连接数,minEvictableIdleTimeMillis 参数表示一个连接空闲多长时间后将被清除或回收。这可以防止长时间未使用的连接被 MySQL 服务器关闭。
druid:
  maxIdle: <设置最大空闲连接数>
  minEvictableIdleTimeMillis: <设置空闲连接的最小可驱逐时间(毫秒)>

  1. 在 MySQL 服务器端增加 wait_timeout 参数的值。这将允许连接在空闲状态下保持更长的时间。然而,需要注意的是,这可能会导致服务器资源占用较高,因此请根据实际情况进行调整。

  2. 在连接 MySQL 数据库时,使用 Connector/J 驱动的 autoReconnect=true 属性。这样在连接断开后,驱动程序会尝试自动重新连接。需要注意的是,这种方法可能会隐藏一些潜在的问题,因此在使用前要仔细权衡利弊。

jdbc:mysql://<hostname>:<port>/<database>?autoReconnect=true

尝试根据上述方法调整 druid 连接池和 MySQL 服务器的配置,以解决这个通信问题。

网上很多人都是把max-wait设置的小点, 例如 10000, 然后解决的, 这真的可以解决这个问题吗?

maxWait 参数并不是用来表示连接池持有数据库连接空闲也依旧占用多长时间的意思。实际上,maxWait 是 Druid 连接池配置中的一个参数,表示从连接池中获取连接时的最大等待时间。

当一个线程需要从连接池获取一个连接时,如果连接池中没有可用的连接,该线程会等待。maxWait 参数用于指定等待的最大时间(以毫秒为单位)。如果在 maxWait 所设置的时间内仍然无法获取到可用的连接,那么该线程将抛出一个异常。这可以防止线程因为等待连接而长时间阻塞。

另一方面,关于连接池持有数据库连接空闲依旧占用的时间,你可以查看 minEvictableIdleTimeMillis 参数。这个参数表示连接空闲多长时间后会被清除或回收。通过设置这个参数,你可以控制连接池中连接的最小空闲时间。

max-wait 设置得较小(例如 10,000 毫秒)并不能直接解决这个问题。实际上,减小 max-wait 只是减少了等待从连接池中获取连接的时间,但并不能解决连接空闲超时的根本问题。

max-wait 设置得较小可能会减轻问题的表面现象,因为在高并发场景下,等待时间较短可能会使得连接更快地被分配给其他线程,从而减少单个连接空闲的时间。然而,这并不能保证在低负载情况下连接不会长时间保持空闲状态。

为了解决这个问题,建议采用前面提到的方法,例如:

  1. 使用 testOnBorrowvalidationQuery 参数来检查从连接池获取的连接的有效性。
  2. 调整 maxIdleminEvictableIdleTimeMillis 参数,以便更好地管理连接池中的空闲连接。
  3. 调整 MySQL 服务器的 wait_timeout 参数,使其允许连接在空闲状态下保持更长的时间。
  4. 在连接字符串中添加 autoReconnect=true,以便在连接断开时尝试自动重新连接。

这些方法可以更有效地解决连接空闲超时的问题。

网上有人说testOnReturn和testOnBorrow都为false时性能最好, 是这样的吗?

testOnReturntestOnBorrow 都设置为 false 时,性能可能会有所提升。这是因为在这种情况下,连接池不会在归还或获取连接时执行额外的有效性检查。这样可以减少一些开销,从而提高性能。

然而,并非所有情况下都适合将这两个参数设置为 false。例如,在你之前提到的问题中,由于连接空闲超时导致的通信问题,这种情况下,将 testOnBorrow 设置为 true 可以帮助检查连接的有效性,从而避免因为使用无效连接而导致的问题。

在实际应用中,需要根据具体场景和需求来决定是否启用这些参数。如果数据库服务器和连接池的配置良好,并且连接稳定性较高,可以考虑将这些参数设置为 false 以提高性能。然而,如果连接稳定性存在问题,或者需要确保连接的有效性,那么启用这些参数可能是更好的选择。

总之,在实际应用中,需要权衡性能和稳定性,根据具体情况选择合适的参数配置。文章来源地址https://www.toymoban.com/news/detail-472628.html

到了这里,关于druid之连接空闲超时问题FIX的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kafka连接超时问题及解决方法

    Kafka是一个高性能、分布式的消息队列系统,被广泛应用于大规模数据处理和实时流处理场景。然而,在使用Kafka进行远程连接时,有时会遇到连接超时的问题。本文将介绍Kafka连接超时问题的原因,并提供一些解决方法。 连接超时问题通常会在以下几种情况下出现: 网络问

    2024年02月04日
    浏览(38)
  • 解决FinalShel连接虚拟机超时问题

    为了解决链接超时问题,自己电脑底部任务栏开了一大堆,浏览器里网页开了一个又一个,这种搜索无果的情况,持续了大概3天的时间,中间怀疑自我到是不是我的电脑硬件少了个螺丝什么的(哈哈哈哈),还好目前这一切都结束了。 这绝对是到目前为止难度和付出时间最不匹

    2024年01月18日
    浏览(31)
  • ElasticSearch|ES 连接超时及创建连接失败问题定位过程记录

    socket.timeout:等待源端服务器响应超时 ConnectionRefusedError:尝试创建连接被拒绝 ES 集群中某个节点的 ES 主进程被杀(由于服务器内存不足导致),导致该节点 ES 重新拉起,报 “尝试创建连接被拒绝”; ES 集群中某个节点的服务器内存不足,导致该节点 ES 的 cache 被清空,E

    2024年02月04日
    浏览(38)
  • 【数据库连接问题】Java项目启动时无限异常com.alibaba.druid.pool.DruidDataSource : create connection SQLException

    Java项目启动失败, ERROR:com.alibaba.druid.pool.DruidDataSource : create connection SQLException 在此之前这个SpringBoot项目中使用的是单一数据库读写策略。今天尝试使用读写分离策略,在 application.yml 配置文件中加入了以下读写分离相关内容后启动项目失败。 根据网上的解决方法,初步怀

    2024年02月16日
    浏览(33)
  • 【macOS 系列】下载brew或其他依赖包提示连接超时的问题解决

    在下载brew或其他依赖包提示连接超时 错误信息: 最简单的方式,就是修改DNS:为 114.114.114.114 或者 8.8.8.8 就好。 如何修改: 右上角-网络-网络偏好设置-高级: 最终的效果: 如果你在web前端开发、面试、前端学习路线有困难可以加我V:imqdcnn。免费答疑,行业深潜多年的技

    2024年02月12日
    浏览(34)
  • 软件测试|解决Github port 443 : Timed out连接超时的问题

    前言 GitHub是全球最大的开源代码托管平台之一,许多开发者和团队使用它来管理和协作开源项目。但在当下,我们在clone或者提交代码时会经常遇到\\\"GitHub Port 443: Timed Out\\\"错误,这意味着我们的电脑无法建立与GitHub服务器的安全连接。这个问题通常由网络问题或防火墙设置引起

    2024年02月07日
    浏览(38)
  • 【完美解决】GitHub连接超时问题 Recv failure: Connection was reset

    已经开了梯子但是在Idea中使用git(GitHub)还是连接超时 Recv failure: Connection was reset 。此时需要让git走代理。 1.对右下角网络点击右键 - 打开 网络和Internet设置 2. 代理 - 查看到地址和端口号 127.0.0.1:7890 3.在终端(cmd)输入命令 4.查看是否设置成功 至此完成 相当丝滑 ^ ^

    2024年02月08日
    浏览(34)
  • Rancher连接超时问题:解决dial tcp xxx:: i/o timeout错误

    Rancher连接超时问题:解决dial tcp xxx:: i/o timeout错误 在使用Rancher进行编程时,有时可能会遇到连接超时的问题。特别是在执行Post请求时,可能会收到类似于\\\"dial tcp xxx:: i/o timeout\\\"的错误消息。本文将介绍如何解决这个问题,并提供相应的源代码示例。 出现这个错误的原因通常

    2024年02月05日
    浏览(31)
  • Android Studio或IntelliJ IDEA 构建Gradle项目时,gradle下载时连接超时问题

    用IntelliJ IDEA 创建一个Gradle项目,下载gradle时显示连接超时。 问题如下 : 在项目根目录的gradle目录下,gradle-wrapper.properties文件定义了用于构建项目的gradle工具的下载地址 services.gradle.org 。由于该网站的服务器在国外,所以在国内访问可能存在连接超时问题,访问不到。 笔者

    2024年02月04日
    浏览(53)
  • 若依框架 - 短时间内断开连接,重复跳转至登录界面问题的解决方法(docker 与 redis)、令牌超时问题

    在很短的时间内不去操作系统,就会自动提示, 登录状态已过期,您可以继续留在该页面,或者重新登录 ,所以老是要跳转到登录界面,这一点很麻烦,非常影响用户体验。 令牌设置超时时间,过于短暂; redis 服务的启动配置文件有问题,没有配置密码登录,而是默认配置

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包