环境:
jdk1.6.0_12
mysql-connector-java-5.0.6-bin.jar程序:
.......
Statement stmt = myconn.createStatement();
ResultSet rs = stmt.executeQuery("select count(*) from mytable where my条件");
while (rs.next()) {
   int count = rs.getInt(1);
}
.......
实际上我要通过count这个变量来判断表中有没有满足条件的数据,
有的话接下来执行更新操作
没有的话接下来执行插入操作
问题:
现在执行的时候偶然出现一次count变量和表中的满足条件的纪录数不一致的情况.
表中有一条数据,正常情况下应该是 1 
现在只出现一次这个错误请问是什么原因?

解决方案 »

  1.   

    mysql-connector-java-3.0.17-ga-bin.jar
    用这个版本的驱动比较稳定
      

  2.   

    换一种思路:Statement stmt = myconn.createStatement(); 
    ResultSet rs = stmt.executeQuery("select 1 from mytable where my条件"); 
    if(rs.next()) { //表示有
      //你要做的事情  
    } else//表示没有
    {
    //你要做的事情
    }
      

  3.   

    不是web处理,可能不是并发的问题,在执行log上看,发生错误的时候只有这段逻辑在运行,其他对数据库的操作只有查询了,到现在为止还没有再出现过类似的错误
      

  4.   

    AWUSOFT的方法有可能解决,
    现在我就是想找出原因,因为客户需要理由,
    有人告诉我可能是Statement的内部Cursor出了问题,导致取到的值错误,但是在网上找不到相关的文章
      

  5.   

    “("select count(*) from mytable where my条件"); ”
    建议使用if而不要使用while来判断或者获取数据不行就换一下驱动包试试
      

  6.   

    count(*) 会找到记录,即使没有也会返回0所以代码可以如下写:Statement stmt = myconn.createStatement();
    ResultSet rs = stmt.executeQuery("select count(*) from mytable");
    rs.next();
    int count = rs.getInt(1);
    System.out.println(count);
      

  7.   

    出现满足条件不一致是你的条件组装sql的问题,和程序没什么关系。
      

  8.   


    for(int i= 0;i< idxmax;i++){
       ResultSet rs = stmt.executeQuery("select count(*) from mytable where my条件"); 
       int count = 0;
       while (rs.next()) {
          count = rs.getInt(1);
       }
       rs.close();
       if(count ==1){
          stmt.executeUpdate("update ....... ")
       }else{
          stmt.executeUpdate("insert into  ....... ")
       }
    } 我用同一个Statement在循环中多次使用会不会是原因?
      

  9.   

    commit了吗?或者你的Connection是autocommit吗?
    还有,业务上是否有排他处理的可能,即有可能存在两个事务同时操作同一个表?
      

  10.   

    没有commit,不是autocommit,其他的操作只是select
      

  11.   

    没有commit的话,当你的回滚段不够大时,有可能会导致数据不一致而出错
      

  12.   

    谢谢大家关注,现象没有再现过,不过下面的代码执行也不稳定,有时正常有时错,现在已经全部改变了写法.................
    Statement st = myCon.createStatement();
    ResultSet rs = stmt.executeQuery("select count(*) from mytab where mytab.col1 = 'aaa' and mytb.col2 = 'bbb'");
    while(rs.next()){
    int count = rs.getInt(1);
    }
    .................
    mytab.col1的写法没有必要,可能是错误的原因
    修改成下面的形式了
    [color=#FF0000]PreparedStatement pst = myCon.prepareStatement(sqlstr);
    结帖送分,谁知道详细的原因还请继续