java - MySQLNonTransientConnectionException:连接关闭后不允许任何操作。
问题描述
所以我做了一堆异步调用,唯一的问题是,在我生成 PreparedStatement 的 prepare 方法中,它会抓取连接(或者如果连接有问题,则使用新的连接),并且由于某种原因仍然会抛出这个错误。
我最初认为(并且仍然这样做)这是因为大多数调用此方法的用例都是异步调用的。所以我使方法同步(以前从未使用过该关键字,但经过一些研究后认为它很合适),但该方法仍然引发错误......
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,该连接现已关闭
您应该使用连接池进行调查,该连接池将为每个线程提供自己的连接,该连接在“关闭”时返回到池中。
推荐阅读
- r - 在ggplot2中绘制多个组的平均值
- apache-kafka - 设置 Apache Kafka 集群
- corda - Oracle RAC (Corda Enterprise) 中的高可用性公证服务设置
- python - 如何使用字典将随机采样函数的性能从 O(n) 提高到 O(logn)?
- csv - 将 PDF 元数据导出到 CSV
- php - 按产品类别列出的产品标签列表 - 标签不可点击或链接
- excel - x-rates Excel VBA 数据拉取
- php - Nova Relatable Filtering - 如何过滤 company_id 与位置 company_id 匹配的用户
- java - 为什么 toMap 放置不当会导致 RXJava 出现问题?
- javascript - Highcharts:如何在多系列图表中使用数据集设置每列,每个系列的颜色?