当前位置: 代码迷 >> J2SE >> 关于java集合中的有关问题
  详细解决方案

关于java集合中的有关问题

热度:49   发布时间:2016-04-23 20:13:19.0
【求助】关于java集合中的问题
现在问题呢就是,我有一个线程在一直的跑,而在这个线程中有个查询数据库的方法,也就是说我要做的事是一直查询数据库,把查询到的数据取出来,放入集合中,然后把取出来的数据调用webservice接口,把数据推送过去,但是这样做的后果呢就是在向webservice发送数据的时候,会重复发送很多已经发送过的数据,而且还是一直不停的发,我看了下数据库,有条记录发送了75次、怎么才能避免这样的问题呢?
是在数据插入集合的时候做个判断还是怎么的?
各位大神请求帮助啊、
有方法的请给点代码和文字上的提示好不。
------解决思路----------------------
在数据库增加一个字段,是否已经发送,对于发送过的数据不再发送就可以了。

循环扫描数据库的时候中间最好有一点点的间隔,具体间隔时间根据你的系统对实时性的要求,如果实时性要求不高的话,则间隔时间长点,如果实时性要求高,则间隔短点。
------解决思路----------------------
1,必须要增加字段表明数据发送状态。
2,查询《待发送》的数据后立刻把数据库里的标记成《正在发送》
3,数据推送结束后把数据库里的标记成《已经发送》
------解决思路----------------------
如果不改变数据库的情况下,在发送前对数据进行缓存;
感觉你的数据应该是最新数据,可能查询会重复,但这种数据一般会有一个排序,比如时间等,
把这个关键数据域作为发送前的判断可能会有用。
------解决思路----------------------
你只有一个线程在后台做这件事,因此,你在发送的时候把集合复制一份。


List  原来的 ...;

List 准备发送的 = new ArrayList(原来的);

Sender s ...;
s.send(准备发送的);

原来的.removeAll(准备发送的) ; // 把已经发送的所有对象从原来的集合中删除掉。


注意如果你是一个线程准备数据,另一个线程发送,你就需要在修改这个集合时使用同步锁。如果你是单一线程发送,那你发送完了清空集合,另外你从数据库中发现发送了75次那表示你发送成功后会记录它已经发送了?那下次取的时候不要再选它了。


readFromSocket 这个表示对方出错了,可能是你给的数据有问题,也可能是对方自己出了其它问题,所以你先确认一下数据没有问题。

------解决思路----------------------
我觉得这种情况应该在数据库的表上有一个字段记录着发送日期,当它不为空时表示已经发送过了。
------解决思路----------------------
引用:
Quote: 引用:

我觉得这种情况应该在数据库的表上有一个字段记录着发送日期,当它不为空时表示已经发送过了。


但是也还是有重复数据的、昨天我测试过,在我程序运行的没多久的时候,我改了数据库的标志位。
每次取100条,到200条的时候有3条重复的,到300条的时候有4条是重复的、


1、要么是你用多个线程在发送,而多个线程获取数据的时候没有很好的用事务控制
2、你的sql语句错误
3、程序本身逻辑就错了

通过你描述的情况已经无法为你诊断,其实这个问题真的很简单,只要你每次获取数据的时候,将数据设置成正在发送状态(这两步需要通过事务控制,而且一开始获取数据的时候必须要使用for update加锁),发送成功了之后更新为发送成功状态。可以考虑增加一个设置,处于正在发送状态的信息如果超过一个设置时间,则视为发送失败。
  相关解决方案