所以我做了一堆异步调用,唯一的问题是,在我的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条答案
按热度按时间5n0oy7gb1#
类似的事情正在发生:
线程1:调用
prepare()
,创建连接并返回准备好的语句并离开prepare()
,因此其他线程现在可以进入prepare()
线程1:开始运行查询线程2:输入prepare并检查连接是否正常——这与线程1创建并使用的连接相同。
线程1:关闭连接
线程2:尝试调用连接上的preparestatement,该连接现在已关闭
您应该研究如何使用连接池,该连接池将为每个线程提供自己的连接,该连接在“关闭”时返回到池中。