Mysql连接出现的异常:MySQLNonTransientConnectionException: No operations allowed after statement closed

MySQLNonTransientConnectionException

作为Java小白,今天遇到了一个很神奇的东西,就是这串异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
 at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
 at com.mysql.jdbc.Util.getInstance(Util.java:408)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498) ...............

       今天捣鼓了好久,看了网上的一些解决方法对我来说好像没什么用😁,但是对你们来说可能有用。我自己的解决方法留在了最后,毕竟我是小白😁。
       这个异常之所以会出现,是因为Mysql在5以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后,Mysql会自动把这个连接关闭。所以使用连接池的时候虽然连接对象还在但是链接数据库的时候会一直报这个异常。同时不排除在多次进行数据库操作时,只进行了一次的数据库驱动连接的选择。在多次使用的时候会导致,一直使用那个,会导致一直没有对连接关闭(第三种解决方法)。

一、

第一种是在DB连接字符串后面加一个参数。这样的话,如果当前链接因为超时断掉了,那么驱动程序会自动重新连接数据库。

jdbc:mysql://localhost:3306/数据库名?autoReconnect=true
二、

       Mysql 服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该connection。 这就是问题的所在,在C3P0 pools中的connections如果空闲超过8小时,mysql将其断开,而C3P0并不知道该connection已经失效,如果这时有 Client请求connection,C3P0将该失效的Connection提供给Client,将会造成上面的异常。
       解决的方法有3种:
              ①增加wait_timeout的时间。
              ②减少Connection pools中connection的lifetime。
              ③测试Connection pools中connection的有效性。

三、这里是我出现的问题(Java小白,不喜勿喷)

问题代码:

static {
    Properties properties = new Properties();
    try {
        properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("database.properties"));
        //properties.load(new FileInputStream("./src/database.properties"));
        driverClass = properties.getProperty("driver");
        url = properties.getProperty("url");
        user = properties.getProperty("user");
        password = properties.getProperty("password");
        conn = DriverManager.getConnection(url, user, password);
    } catch (IOException | SQLException e) {
        e.printStackTrace();
    }
}
public static Connection getConnection() {
    return conn;
}

修改后:

static {
    Properties properties = new Properties();
    try {
        properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("database.properties"));
       	//properties.load(new FileInputStream("./src/database.properties"));
        driverClass = properties.getProperty("driver");
        url = properties.getProperty("url");
        user = properties.getProperty("user");
        password = properties.getProperty("password");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static Connection getConnection() {
    try {
        conn = DriverManager.getConnection(url, user, password);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return conn;
}
你遇到的错误是SQL错误[S1009]: No operations allowed after statement closed。这个错误通常发生在你尝试在已关闭的语句后执行操作时。 对于这个错误,有几个可能的原因和解决方法。首先,这个错误可能是因为你在已关闭的语句对象上调用了方法。要解决这个问题,你可以确保在执行任何操作之前,先检查语句对象的状态,确保它没有关闭。你可以使用`isClosed()`方法来检查语句对象的状态,如果返回true表示已关闭,你就需要重新创建一个新的语句对象来执行你的操作。 另一个可能的原因是,在某些情况下,MySQL会自动关闭空闲的连接。这可能会导致你的语句对象被关闭,从而引发这个错误。为了解决这个问题,你可以尝试通过增加等待超时时间来延长MySQL连接的生命周期。你可以使用SQL语句`set global wait_timeout=1000000;`来设置等待超时时间。另外,你还可以在连接字符串后面添加一个参数`autoReconnect=true`,这样在连接因为超时而断开时,驱动程序会自动重新连接数据库。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Cause: java.sql.SQLException: No operations allowed after statement closed.](https://blog.csdn.net/weixin_43777152/article/details/128936666)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [java.sql.SQLException: No operations allowed after statement closed.](https://blog.csdn.net/jcmj123456/article/details/128198267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值