我在java中有一段很长的代码,它使用selenium webdriver和firefox来测试我的网站。请原谅我,如果我不能在这里重现它。它有一个无限的while循环来重复执行它的功能。多数民众赞成应该做的事情。另外,我不使用多线程。
有时,它会卡住。我使用Windows系统,代码在命令提示符下运行。当它卡住时,不会抛出任何错误或异常。它就像“它挂起”(只有代码运行的窗口挂起)。然后我必须使用CTRL + C.有时它会在此之后恢复工作,有时它会被终止并重新启动它。它工作正常,但经过一些循环后它再次“挂起”。另外,我注意到它通常在执行查询mysql数据库的方法之一。
代码运行无限循环。每次,它查询mysql数据库,从特定的表(每个循环中的一个值)获取一个值(其'status'字段不是'done')并继续使用此值进行测试。在循环结束时,表已更新(该值的“status”列设置为“done”)。如果在该特定表中没有“status”不等于“done”的新值,理想情况下应显示“NO NEW VALUE”。但是,在使用了所有值之后,它只占用最后一个使用的值(即使它的状态在前一个循环结束时更新为“完成”)并继续。然后我必须终止执行并再次运行代码。这次无限循环开始时,它会查询数据库并正确显示“NO NEW VALUE”,再次查询,再次显示消息等等(这应该是什么)
我使用con.close()关闭sql连接。
似乎在运行循环几次后,某些资源在某处耗尽。但这只是一个疯狂的猜测。
任何人都可以建议问题是什么,我该如何解决?
以下是一段相关的代码:
try{
String sql = "select something from somewhere where id = ? and is_deleted = '0';";
System.out.println("\n"+sql + "\n? = " + pID);
PreparedStatement selQuery1 = conn.prepareStatement(sql);
selQuery1.setString(1, pID);
ResultSet rs1 = selQuery1.executeQuery();
//Extract data from result set
while(rs1.next() && i1<6){
//do something
}//end while loop
String sql2 = "select something2 from somewhere2 where id = ? and is_deleted = '0';";
System.out.println("\n"+sql2 + "\n? = " + pjID);
PreparedStatement selQuery2 = conn.prepareStatement(sql2);
selQuery2.setString(1, pjID);
ResultSet rs2 = selQuery2.executeQuery();
//Extract data from result set
while(rs2.next() && i1<6){
//do something
}//end while loop
System.out.println("\nDone.");
conn.close();
}catch (SQLException e) {
flag=false;
}
请注意,任何地方都不会抛出异常。运行代码的窗口在显示两个查询语句后立即冻结(也是一次)。
答案 0 :(得分:1)
我忘了关闭查询和结果集。只是关闭连接应该隐式关闭查询和结果集,但它始终不起作用。
答案 1 :(得分:0)
我最近也遇到了同样的问题。但就我而言,问题在于索引。我只是在这里指出,以便它可以对其他人有所帮助。
在我的情况下,我从MenuMaster表中获取菜单项。因此,在成功登录后,我正在使用MySQL连接器驱动程序访问数据库以获取菜单项。在这里,我需要使用他们的子菜单获取父菜单。在我的查询中,在where子句中我没有使用任何主键或唯一键。所以,这需要很长时间。所以只需制作一个该键的索引,它就像魅力一样......