mysqlnontransientconnectionexception:连接关闭后不允许执行任何操作

3hvapo4f  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(362)

所以我做了一堆异步调用,唯一的问题是,在我的prepare方法中,它生成了一个preparedstatement,它获取了连接(如果连接有故障,它会使用一个新的连接),并且出于某种原因仍然抛出这个错误。
我最初认为(现在也是这样)这是因为大多数调用这个方法的用例都是异步调用的。所以我让这个方法同步(以前从未使用过这个关键字,但经过一番研究后认为它是合适的),但是,这个方法仍然会抛出一个错误。。。

public synchronized PreparedStatement prepare(String statement) throws SQLException {
    Connection c = getConnection();
    if (c == null || c.isClosed()) return getNewConnection().prepareStatement(statement);
    Logger.debug("not null and not closed " + Thread.currentThread().getId());
    return c.prepareStatement(statement); //throws error here
}

如何使其他线程在prepare方法完成之前不能更改连接?

5n0oy7gb

5n0oy7gb1#

类似的事情正在发生:
线程1:调用 prepare() ,创建连接并返回准备好的语句并离开 prepare() ,因此其他线程现在可以进入 prepare() 线程1:开始运行查询
线程2:输入prepare并检查连接是否正常——这与线程1创建并使用的连接相同。
线程1:关闭连接
线程2:尝试调用连接上的preparestatement,该连接现在已关闭
您应该研究如何使用连接池,该连接池将为每个线程提供自己的连接,该连接在“关闭”时返回到池中。

相关问题