在mysql查询期间在java代码中进行一些迭代后,无限循环“挂起”

时间:2013-11-09 14:08:08

标签: java mysql firefox selenium selenium-webdriver

我在java中有一段很长的代码,它使用selenium webdriver和firefox来测试我的网站。请原谅我,如果我不能在这里重现它。它有一个无限的while循环来重复执行它的功能。多数民众赞成应该做的事情。另外,我不使用多线程。

  1. 有时,它会卡住。我使用Windows系统,代码在命令提示符下运行。当它卡住时,不会抛出任何错误或异常。它就像“它挂起”(只有代码运行的窗口挂起)。然后我必须使用CTRL + C.有时它会在此之后恢复工作,有时它会被终止并重新启动它。它工作正常,但经过一些循环后它再次“挂起”。另外,我注意到它通常在执行查询mysql数据库的方法之一。

  2. 代码运行无限循环。每次,它查询mysql数据库,从特定的表(每个循环中的一个值)获取一个值(其'status'字段不是'done')并继续使用此值进行测试。在循环结束时,表已更新(该值的“status”列设置为“done”)。如果在该特定表中没有“status”不等于“done”的新值,理想情况下应显示“NO NEW VALUE”。但是,在使用了所有值之后,它只占用最后一个使用的值(即使它的状态在前一个循环结束时更新为“完成”)并继续。然后我必须终止执行并再次运行代码。这次无限循环开始时,它会查询数据库并正确显示“NO NEW VALUE”,再次查询,再次显示消息等等(这应该是什么)

  3. 我使用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;
    }
    

    请注意,任何地方都不会抛出异常。运行代码的窗口在显示两个查询语句后立即冻结(也是一次)。

2 个答案:

答案 0 :(得分:1)

我忘了关闭查询和结果集。只是关闭连接应该隐式关闭查询和结果集,但它始终不起作用。

答案 1 :(得分:0)

我最近也遇到了同样的问题。但就我而言,问题在于索引。我只是在这里指出,以便它可以对其他人有所帮助。

在我的情况下,我从MenuMaster表中获取菜单项。因此,在成功登录后,我正在使用MySQL连接器驱动程序访问数据库以获取菜单项。在这里,我需要使用他们的子菜单获取父菜单。在我的查询中,在where子句中我没有使用任何主键或唯一键。所以,这需要很长时间。所以只需制作一个该键的索引,它就像魅力一样......