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);