【问题标题】:No operations allowed after connection closed on mysql在mysql上关闭连接后不允许任何操作
【发布时间】:2015-10-05 08:32:06
【问题描述】:

我为我的网站更改了托管公司,其中我使用了一个 mySQL 数据库。 有时我会收到此错误:

连接关闭后不允许任何操作。

我记得我第一次在旧服务器上运行我的网站时遇到了同样的问题,我通过“配置修复”而不是“代码修复”解决了这个问题,但我不记得我的做了:(

我在这里阅读了 mant 帖子,但每个人都在谈论代码修复,我不认为这是我的情况

有人可以帮我吗?

谢谢

编辑

我在旧的 context.xml 文件中找到了这个;可能这就是我解决问题的方法

  validationQuery="SELECT 1"
  testOnBorrow="true"

testOnBorrow:(布尔值)指示对象在从池中借用之前是否会经过验证。如果对象验证失败,它将从池中删除,我们将尝试借用另一个。注意 - 要使真值生效,validationQuery 参数必须设置为非空字符串。默认值为假

validationQuery:(字符串)在将连接返回给调用者之前,将用于验证来自该池的连接的 SQL 查询。如果指定,此查询不必返回任何数据,它只是不能抛出 SQLException。默认值为空。示例值为 SELECT 1(mysql)、select 1 from dual(oracle)、SELECT 1(MS Sql Server)

有人可以确认吗?

【问题讨论】:

  • 也许这有帮助:No Operations allowed.
  • 可能与您的数据库配置的连接超时有关。
  • 我通常在我的 JDBC 连接 URL 中使用 AutoReconnect=true 参数:(例如:“jdbc:mysql://localhost:3306/my-db?autoReconnect=true”)。
  • 我可以确认,在我运行我的 SpringBoot 应用程序(连接到 MySQL)之前设置了以下环境变量后,我不再看到 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 错误:spring.datasource.testOnBorrow=truespring.datasource.validationQuery="SELECT 1"spring.datasource.validationInterval=30000。详见 Tomcat 的 JDBC 池属性here

标签: java mysql


【解决方案1】:

您可以在 JDBC 连接 URL 中使用 autoReconnect=true 参数:(例如:“jdbc:mysql://localhost:3306/my-db?autoReconnect=true”)。

但请注意,如果您的应用程序不能正确处理 SQLException,这可能会导致问题。

来自 MySql 文档:

自动重新连接

驱动程序是否应该尝试重新建立陈旧和/或失效的连接?如果 > 启用,驱动程序将为在陈旧或死连接上发出的查询抛出异常,这些查询属于当前事务,但会在新事务中的连接上发出下一个查询之前尝试重新连接。不建议使用此功能,因为当应用程序无法正确处理 SQLExceptions 时,它会产生与会话状态和数据一致性相关的副作用,并且仅在您无法配置应用程序以处理由以下原因导致的 SQLExceptions 时使用正确的死和陈旧的连接。或者,作为最后一个选项,研究将 MySQL 服务器变量“wait_timeout”设置为较高的值,而不是默认值 8 小时。

【讨论】:

    【解决方案2】:

    在您的配置属性中,您可能使用了 c3p0 属性 maxIdleTime,但 c3p0 属性是使用 c3p0 配置的。 prefix 或 hibernate.c3p0.. 请注意,启用任何 c3p0 属性会通过 hibernate 启发式自动启用相应的连接提供程序。在日志中没有看到您正在使用 c3p0。如果您没有配置数据源,那么 Hibernate 将使用 hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider。此连接提供程序具有内置的基本连接池,您可以为其设置 hibernate.connection.pool_size,但它仅用于开发目的。永远不要在生产环境中使用它。

    您可能对如何修复 java.net.SocketException: Broken pipe 话题进行了无休止的讨论。一段时间后,您会发现池中的连接一直处于打开状态,但由于以下原因突然在另一端关闭:

    • 防火墙或路由器可能会限制空闲连接(MySQL 客户端/服务器协议不 ping)。
    • MySQL 服务器可能是 关闭超过 wait_timeout 的空闲连接或 interactive_timeout 阈值。

      为了帮助解决这些问题,可以使用以下提示:

    • 使用了最新 (5.1.13+) 版本的 JDBC 驱动程序。

    • 确保 wait_timeout 和 interactive_timeout 设置得足够高。查看 如果使用了 interactiveClient。 •确保已启用 tcpKeepalive。
    • 确保任何可配置的防火墙或路由器超时设置 允许最大预期连接空闲时间。
    • 确保 从连接池中使用的连接是有效的。使用查询 以 /* ping */ 开始执行轻量级 ping 而不是 完整的查询。请注意,ping 的语法必须与 此处指定。
    • 在使用前明确验证连接 如果连接长时间处于空闲状态。
    • 最小化连接对象闲置而其他对象的持续时间 应用程序逻辑被执行。

    要遵守其中一些选项,您最好使用可与 Hibernate 一起使用的连接池。 Hibernate 支持 commons-dbcp、c3p0 和 proxool。您还可以在 Web 服务器上配置 JNDI 数据源以与 hibernate 一起使用,它有一个连接池。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-16
      • 2020-04-17
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 2021-06-13
      相关资源
      最近更新 更多