我有一个线程定时扫描一个表,如果发现表中有记录,就将所有的内容发送到对应的手机上,然后删除该记录并在另一个表中做日志记录,现在有一个奇怪的问题,如果进行删除等业务操作,则每次只发送一条,其他的得等线程sleep结束后再发送一条,以此类推,直到全部发送完;如果不进行删除等业务操作,则每次都能扫描表中所有的数据,请问是什么原因?(jdk1.5,Oracle 9i)

解决方案 »

  1.   

    你是不是查询操作和删除操作在同一个connection里面?
    当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,ResultSet 对象会自动关闭。
    我猜你的程序应该是这样写的吧,先去查表中的记录 然后
    while(rs.next){
    //先将内容发送到手机
    ......
    //删除该记录并在另一个表中做日志记录
    ......
    }
    当你执行删除操作的时候你查询的ResultSet 对象被自动关闭了,然后rs.next就会等于false 所以每次只发送了一条 然后此线程结束sleep直到再次启动继续发送一条,以此类推。
    建议你先把查出的结果放在list里面 然后遍历list进行发送和删除操作 
      

  2.   

    很简单的问题,debug被。一下就跟中出来了。这么多的操作,要要写在一个事务里边去做。
      

  3.   

    使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connection的commit()方法也会关闭结果集。
    而楼主是用Statement进行了两次操作,一次查询,一次删除。
    建议一个Statement进行一次操作,因为进行一次操作后JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭
    JDBC3.0中,我们可以设置ResultSet是否关闭。要完成这样的ResultSet的对象的创建,要使用的Statement的创建要具有三个参数,这个Statement的创建方式也就是,我所说的Statement的第三种创建方式。如下: 
    Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability) 
    ResultSet rs = st.excuteQuery(sqlStr); 
    前两个参数和两个参数的createStatement方法中的参数是完全相同的,这里只介绍第三个参数: 
        resultSetHoldability表示在结果集提交后结果集是否打开,取值有两个: 
        ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。 
        ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭。