作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我进行了一堆异步调用,唯一的问题是,在我的准备方法中生成一个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
}
如何才能使其他线程在准备方法完成之前无法更改连接?
最佳答案
类似的事情正在发生:
线程 1:调用 prepare()
,创建连接并返回准备好的语句,然后离开 prepare()
,因此其他线程现在可以进入 prepare( )
线程 1:开始运行查询
线程 2:进入准备并检查连接是否正常 - 这与线程 1 创建并正在使用的连接相同。
线程1:关闭连接
线程2:尝试在连接上调用prepareStatement,该连接现已关闭
您应该研究使用连接池,它将为每个线程提供自己的连接,该连接在“关闭”时返回到池中。
关于java - MySQLNonTransientConnectionException : No operations allowed after connection closed.,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53754958/
我是一名优秀的程序员,十分优秀!