Java 为什么我的执行官挂断了?
我正在运行一段看似简单的代码。其简化形式如下所示:Java 为什么我的执行官挂断了?,java,mysql,Java,Mysql,我正在运行一段看似简单的代码。其简化形式如下所示: public class ReadDB throws SQLException { private Connection conn; private PreparedStatement myStmt; public ReadDB(Connection connection) { conn = connection; } public List<GameEvent> getE
public class ReadDB throws SQLException {
private Connection conn;
private PreparedStatement myStmt;
public ReadDB(Connection connection) {
conn = connection;
}
public List<GameEvent> getEvents(int gameId) {
List<GameEvent> ret = new ArrayList<GameEvent>();
myStmt = conn.prepareStatement("select * from logs where gameid=? order by id");
myStmt.setInt(1, gameId);
myStmt.setQueryTimeout(10); // Wasn't there before, doesn't really help
ResultSet rs = myStmt.executeQuery();
while( rs.next() ) {
// Do stuff, using "rs.getString()"
}
rs.close();
myStmt.close()
return ret;
}
}
现在,我的问题是:在多次调用getEvents
方法(大约30次)之后,executeQuery()
将挂起。没有异常,没有返回值,什么都没有-它只是停在那里,可能在某种循环中
数据库是只读的,因此没有任何类型的INSERT
。连接到(MySQL)数据库时,show processlist
会在连接时间增加时将连接列为Sleep
。当然,我可以在并行窗口中很好地运行查询,但是Java程序由于某些原因无法运行。而且,它总是挂在不同的gameId
,因此它与特定的集合无关
考虑到一段非常相似的代码过去运行得很好,我猜要么我没有以正确的方式打开/关闭连接,要么是网络相关的问题
有什么想法吗
编辑:我根据一些评论更新了代码,但仍然没有积极的结果。关于调试,代码似乎停留在了最深层次
n = socketRead0(fd, b, off, length, timeout);
在
java.net.SocketInputStream
中的read()
函数内部。跟踪将是:java.sql.PreparedStatement
(代码中的一个)的实例调用executeQuery
,调用executeInternal
,调用几个MysqlIO
函数,其中最深的是MysqlIO.readFully
(由MysqlIO.nextRowFast
调用)。我无法窥视这些函数的内部,但我可以看到它们正在被调用。然而,我怀疑这是太多的细节,错误一定在其他地方。我也遇到过类似的问题。程序实际上停止并等待executeQuery()
命令
但当我执行以下操作时,我的问题得到解决:
直接从Oracle中删除表后提交Oracle数据库
客户端(Toad)。可以确定的是,您已经没有以正确的方式关闭结果集(它应该在最后一个块中关闭),并且根本没有关闭stzment。所以我也会打赌资源关闭问题。但是你没有告诉我们你是如何打开和关闭连接的。你应该用你创建语句的方法关闭你准备好的语句!也许您达到了打开语句(游标)过多的限制。太慢;)您是否使用了调试器来查看它挂起的确切位置?它是在等待一个服务器的答案,而这个答案并没有出现,还是在一个无限循环中做一些工作?您是否查看了服务器以查看当前正在执行的查询?当返回的每一行都具有相同的id时,为什么要按id排序?是否在每次调用时都创建/获取新的数据库连接?还是重复使用一个连接?我重复使用同一个连接。
n = socketRead0(fd, b, off, length, timeout);