我正在运行一段看似简单的代码。其简化形式如下所示:
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.SocketInputStream
的 read()
函数内。跟踪将是:java.sql.PreparedStatement
的一个实例(代码中的那个)调用 executeQuery
,它又调用 executeInternal
,后者又调用几个MysqlIO
函数,其中最深的是MysqlIO.readFully
(由MysqlIO.nextRowFast
调用)。我无法查看这个函数的内部,但我可以看到它们被调用。然而,我怀疑这太详细了,错误一定是在其他地方。
最佳答案
我也遇到过类似的问题。程序实际上停止并等待 executeQuery()
命令。
但是当我执行以下操作时,我的问题得到解决: 直接从 Oracle 删除表后提交我的 Oracle 数据库 客户端(蟾蜍)。
关于java - 为什么我的executeQuery挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21582954/