我为我的网站改变了主机公司,我在其中使用了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
有人可以确认吗?
答案 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服务器可能是 关闭超过wait_timeout或的空闲连接 interactive_timeout阈值。
为帮助解决这些问题,可以使用以下提示:
使用最近的(5.1.13+)版本的JDBC驱动程序。
要遵守其中一些选项,您最好使用可与Hibernate一起使用的连接池。 Hibernate支持commons-dbcp,c3p0和proxool。您还可以在Web服务器上配置JNDI数据源以与hibernate一起使用,它具有连接池。