MySQLNonTransientConnectionException:连接关闭后不允许进行任何操作。

时间:2018-12-13 04:18:56

标签: java mysql sql asynchronous

所以Im进行了一堆异步调用,唯一的问题是,在我的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方法完成后才能更改连接?

1 个答案:

答案 0 :(得分:1)

这种事情正在发生:

线程1:调用prepare(),创建连接并返回准备好的语句并离开prepare(),因此其他线程现在可以输入prepare()

线程1:开始运行查询

线程2:进入prepare并检查连接是否正常-这与线程1创建并正在使用的连接相同。

线程1:关闭连接

线程2:尝试在已关闭的连接上调用prepareStatement

您应该使用连接池进行调查,该连接池将为每个线程提供自己的连接,并在“关闭”时将其返回到该池。