5 分钟)准备语句的问题。我在调用 executeBa-6ren">
gpt4 book ai didi

java - MySQL "No operations allowed after statement closed"

转载 作者:行者123 更新时间:2023-11-29 03:34:17 24 4
gpt4 key购买 nike

我遇到了一个奇怪的情况,准备好的语句使用 MySQL Connector/J 访问 MySQL 数据库。在某些环境中,我会定期遇到更长的现有(> 5 分钟)准备语句的问题。我在调用 executeBatch 时经常遇到异常:

“语句关闭后不允许进行任何操作”

但是,没有代码可以关闭我能看到的语句。代码如下所示:

private void execute(MyClass myObj, List<MyThing> things) throws SQLException {
Connection con = null;
PreparedStatement pstmt = null;

try {
con = ConnectionHelper.getConnection();
pstmt = con.prepareStatement(INSERT_SQL);
int c = 0;

for (MyThing thing : things) {
pstmt.setInt(1, myObj.getA());
pstmt.setLong(2, thing.getB());
pstmt.addBatch();

if (++c % 500 == 0) {
pstmt.executeBatch();
}
}

pstmt.executeBatch();
}
finally {
ConnectionHelper.close(pstmt, con);
}
}

ConnectionHelper.close 本质上只是在语句和连接上调用关闭。 ConnectionHelper.getConnection 有点像兔子洞——它使用 java.sql.DriverManager 和 proxool 从池中粗略地检索连接,然后用 Spring DataSourceUtils 包装它。

通常它会在最后一个 pstmt.executeBatch() 上失败,但有时会在其他地方失败。我检查过并且 wait_timeout 和 interactive_timeout 被配置为默认值(绝对> 5 分钟)。而且,在大多数情况下,循环中使用了连接和语句,但几秒钟后语句在循环外失败了。数据库服务器和应用程序服务器在同一子网上运行,因此网络问题似乎不太可能。

正在寻找有关如何调试此问题的任何提示——目前,我正在尝试深入研究 MySQL Connector/J 代码,看看我是否能以某种方式获得一些额外的调试语句。不幸的是,我无法附加调试器,因为它目前只能在选定的几个环境中重现。

最佳答案

看看这条线:

            if (++c % 500 == 0) {
pstmt.executeBatch();
}

如果执行了但循环终止,会发生什么情况。然后您再次调用 pstmt.executeBatch,批处理中没有任何内容。

关于java - MySQL "No operations allowed after statement closed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com