为什么我的executeQuery挂起?

时间:2014-02-05 16:33:38

标签: 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()将会挂起。没有例外,没有返回值,没有 - 它只是停在那里,可能是某种循环。

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

鉴于用于运行的代码非常相似,我猜测要么我没有以正确的方式打开/关闭连接,要么是网络相关的问题。

想法,有人吗?

编辑:我根据地址的一些评论更新了代码,仍然没有正面结果。关于调试,代码似乎停留在

的最深层
n = socketRead0(fd, b, off, length, timeout);

来自read()的{​​{1}}函数内部。跟踪将是:java.net.SocketInputStream的实例(代码中的那个)调用java.sql.PreparedStatement,调用executeQuery,调用executeInternal个函数,其中最深的是MysqlIO个函数MysqlIO.readFully(由MysqlIO.nextRowFast调用)。我无法查看这个函数,但我可以看到它们被调用。但是,我怀疑这个细节太多了,错误必须在其他地方。

1 个答案:

答案 0 :(得分:0)

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

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