我正在运行看似简单的代码片段。在简化形式上,它看起来像这样:
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
调用)。我无法查看这个函数,但我可以看到它们被调用。但是,我怀疑这个细节太多了,错误必须在其他地方。
答案 0 :(得分:0)
我也遇到过类似的问题。该程序实际上停止并等待executeQuery()
命令。
但是当我执行以下操作时,我的问题就解决了: 直接从Oracle删除表后提交Oracle数据库 客户(蟾蜍)。