连接在mysql上关闭后不允许任何操作

时间:2015-10-05 08:32:07

标签: java mysql

我为我的网站改变了主机公司,我在其中使用了mySQL数据库。 我不时会收到这个错误:

  

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

我记得我第一次在旧服务器上运行我的网站时遇到了同样的问题,我用一个"配置修复程序修复了问题"而不是代码修复"但我不记得我做了什么:(

我在这里阅读了mant帖子,但每次都谈到代码修复,我不认为这是我的案例

有人可以帮助我吗?

谢谢

修改

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

  validationQuery="SELECT 1"
  testOnBorrow="true"

testOnBorrow:(boolean)指示在从池中借用对象之前是否验证对象。如果对象无法验证,它将从池中删除,我们将尝试借用另一个。注 - 要使true值生效,必须将validationQuery参数设置为非空字符串。默认值为false

validationQuery :(字符串)在将这些连接返回给调用方之前,将用于验证来自此池的连接的SQL查询。如果指定,此查询不必返回任何数据,它只是不能抛出SQLException。默认值为null。示例值为SELECT 1(mysql),从双(oracle),SELECT 1(MS Sql Server)中选择1

有人可以确认吗?

2 个答案:

答案 0 :(得分:3)

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

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

来自MySql文档:

  

<强> autoReconnect的

     

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

答案 1 :(得分:1)

在配置属性中,您可能已使用c3p0属性maxIdleTime,但使用c3p0配置了c3p0属性。前缀或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一起使用,它具有连接池。