我有一个线程定时扫描一个表,如果发现表中有记录,就将所有的内容发送到对应的手机上,然后删除该记录并在另一个表中做日志记录,现在有一个奇怪的问题,如果进行删除等业务操作,则每次只发送一条,其他的得等线程sleep结束后再发送一条,以此类推,直到全部发送完;如果不进行删除等业务操作,则每次都能扫描表中所有的数据,请问是什么原因?(jdk1.5,Oracle 9i)
解决方案 »
- 关于java 问题
- String类和StringBuffer类的比较
- DOJO树出现下面问题,为什么
- NoClassDefFoundError:org/apche/digesters/Rileset如何解决?
- 我是新手,new GrantedAuthority[] {new GrantedAuthorityImpl("HOLDER")}的字符常理HOLDER是什么意思啊,谢谢!
- 谁能教我写一个读取.properties配置文件的类【★超急件】谢谢
- jfreechart 折线图问题
- struts,怎样用select标签 显示list 里的usermodel
- 使用jBuilder2006开发EJB,在哪地方修改JNDI的名字
- 有关实体BEAN的问题!!高分
- 在mysql5.0中不能插入中文数据
- 找些JSP+TOMCAT+javaBeen方面的小项目练习
当生成 ResultSet 对象的 Statement 对象关闭、重新执行或用来从多个结果的序列检索下一个结果时,ResultSet 对象会自动关闭。
我猜你的程序应该是这样写的吧,先去查表中的记录 然后
while(rs.next){
//先将内容发送到手机
......
//删除该记录并在另一个表中做日志记录
......
}
当你执行删除操作的时候你查询的ResultSet 对象被自动关闭了,然后rs.next就会等于false 所以每次只发送了一条 然后此线程结束sleep直到再次启动继续发送一条,以此类推。
建议你先把查出的结果放在list里面 然后遍历list进行发送和删除操作
而楼主是用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关闭。