java - 为什么我的executeQuery挂起?

标签 java mysql

我正在运行一段看似简单的代码。其简化形式如下所示:

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

这就是数据库初始化的样子(connection 参数):

String url=“jdbc:mysql://server.example.com/database_name”;
cProperties = new Properties();
cProperties.put(“user”, user);
cProperties.put(“password”, password);
// truncate field values that are too long
cProperties.put(“jdbcCompliantTruncation”, “false”); 
connection=DriverManager.getConnection(url,cProperties);

现在,我的问题是:多次调用 getEvents 方法(大约 30 次)后,executeQuery() 将挂起。没有异常(exception),没有返回值,什么都没有 - 它只是停在那里,可能在某种循环中。

数据库是只读的,因此没有任何类型的INSERT。连接到 (MySQL) 数据库时,show processlist 将连接列为 Sleep,同时连接时间增加。当然,我可以在并行窗口中很好地运行查询,但 Java 程序由于某种原因不能。此外,它始终卡在不同的 gameId 中,因此它与该特定集合无关。

鉴于一段非常相似的代码曾经运行得很好,我猜测要么是我没有以正确的方式打开/关闭连接,要么是出现了与网络相关的问题。

有什么想法吗?

编辑:我根据一些评论更新了代码,但仍然没有任何积极的结果。关于调试,代码似乎卡在了最深处

n = socketRead0(fd, b, off, length, timeout);

java.net.SocketInputStreamread() 函数内。跟踪将是:java.sql.PreparedStatement 的一个实例(代码中的那个)调用 executeQuery,它又调用 executeInternal,后者又调用几个MysqlIO函数,其中最深的是MysqlIO.readFully(由MysqlIO.nextRowFast调用)。我无法查看这个函数的内部,但我可以看到它们被调用。然而,我怀疑这太详细了,错误一定是在其他地方。

最佳答案

我也遇到过类似的问题。程序实际上停止并等待 executeQuery() 命令。

但是当我执行以下操作时,我的问题得到解决: 直接从 Oracle 删除表后提交我的 Oracle 数据库 客户端(蟾蜍)。

关于java - 为什么我的executeQuery挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21582954/

相关文章:

客户端的 java 客户端-服务器问题(无 System.out)

java - 读取 Java ResultSet 中的整行

mysql - 为什么在向数据库中插入数据时 `state` 不比 `my` 快?

php - 当我向其添加日期范围时,我的查询将不起作用。使用 PHP 和 MySQL

java - 跳过可选的 bean 引用属性

java - 使用类加载器加载内部类

mysql - 使用子查询中的条件进行计数

mysql - 表锁会阻止行锁定吗

java - Android - 从对话框调用非静态函数

MySQL STR_TO_DATE() 不适用于 LOAD DATA INFILE