【问题标题】:MySQL connection timeoutMySQL 连接超时
【发布时间】:2011-02-05 09:06:21
【问题描述】:

我在 apache tomcat 服务器上运行程序,该程序应该永久打开,但是每天早上(晚上无法访问客户端部分)我收到 MySQL 服务器关闭的错误消息(在 apache tomcat 控制台中)。那么有什么办法可以防止这种情况发生吗? 提前致谢!

【问题讨论】:

  • 你用什么来连接你的数据库?您是否使用了一个连接池,它让数据库连接整夜打开(并且不够聪明,无法在完成后关闭它们,或者至少重新打开消失的连接)?
  • Ops,我错过了我正在使用 Hibernate API 访问数据库
  • 能否请您粘贴确切的错误信息?之后你如何修复你的系统?你重启你的tomcat之后一切都好吗?
  • 好吧,我解决了重启mysqld.exe和tomcat的问题。但正如我建议的那样,我今天早上在休眠 cfg 文件中添加 jdbc:mysql://localhost/mydb?autoreconnect=true 连接再次丢失,但是当我重新启动 tomcat(没有 mysqld)时一切正常。

标签: java mysql tomcat


【解决方案1】:

我想您直接在您的网络应用程序代码中打开连接。 您可以尝试使用超时引入connection pool,以便重新建立连接。

如果这没有帮助,请询问网络管理员是否有状态过滤器来检测超时(当您的客户端空闲时)并关闭连接。

如果您使用数据库池,如 c3p0 或 dbcp,请查看其文档,应该有配置空闲超时或定期检查连接的设置(这将保持连接打开,而不是超时服务器端)

【讨论】:

  • 在这种情况下,我是管理员,但我对连接池不太熟悉,但我会阅读您的文章并尝试搜索解决方案
【解决方案2】:

一段时间后mysql服务器超时连接,默认为28800秒,很可能是你遇到的这个超时。

您可以通过将autoreconnect=true 参数添加到 jdbc url 来指示 mysql 驱动程序在连接丢失的情况下重新连接,例如jdbc:mysql://localhost/mydb?autoreconnect=true

【讨论】:

  • 我试过这个(我必须把 url 放在 hibernata cfg 文件中,对吗?)今天早上又失去了连接,但正如我提到的,当我重新启动 tomcat 时一切正常(之前必须先重新启动 mysqld .exe 首先)
  • 值得注意的是,MySQL Connector/J documentation"不推荐这种方法,因为当应用程序不能正确处理 SQLExceptions 时,它会产生与会话状态和数据一致性相关的副作用,并且仅设计用于当您无法将应用程序配置为正确处理因死连接和陈旧连接而导致的 SQLExceptions 时使用".
【解决方案3】:

是的,我也遇到了同样的问题。尝试将验证查询添加到您的数据源。

这是我的定义:

<Resource auth="Container"
          type="javax.sql.DataSource"
          name="jdbc/gporder"
          driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost/mydb"
          maxActive="10"
          maxIdle="5"
          validationQuery="SELECT 1"
          testOnBorrow="true"
          testWhileIdle="true"
          timeBetweenEvictionRunsMillis="10000"
          minEvictableIdleTimeMillis="60000"
          username="..." password="..."/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 2018-07-15
    • 2019-03-14
    • 1970-01-01
    • 2014-07-24
    • 2012-05-28
    • 2014-03-18
    • 2019-01-26
    相关资源
    最近更新 更多