工作时候遇到了一个郁闷的问题:
web服务器:tomcat问题:
是这样的,现在有个数据接收方法doReceive,先用几个关键字段对表进行查询,发现搜不到数据,就将当前数据插入表。即已经判断重复数据了,但是发现表里还是出现了重复数据。但出现的频率不是很高
当时发生问题的条件:
请求访问doReceive的方法发现timeout了(应该是服务器长时间不响应),就不停的重发数据。看了下表里这2条数据的接收时间相差了4分钟请高手们帮忙看看怎么回事?有什么解决方案?我感觉应该是服务器在处理第一条数据时(服务器不响应,发生timeout),于是第二条重复数据过来了,此刻发现表里没有重复,于是这2条数据一起进去了。java

解决方案 »

  1.   

    1,表设置主键
    2,插入数据前使用触发器
    3,用merge把select和insert用一条sql写,应该就没有时间间隔了吧
      

  2.   

    请求访问doReceive的方法发现timeout了(应该是服务器长时间不响应),就不停的重发数据。服务器都不响应了,还需要重发数据么?我觉得这当做失败处理就好了。
      

  3.   

    大家帮我看看,现在我想了4种方案:
    1.给事务加锁(用ReentrantLock)
    2.用insert if not exists防止插入重复记录,这样应该没有时间间隔了吧
    3.先删除,再插入
    4.先插,再删除这几个都能解决我的问题吗?我比较倾向于第三个
      

  4.   

    补充:如果这个方法调用不是非常频繁或者即时性要求不高的话  可以加上任务队列   然后对方法synchronized  否则处理性能降低
      

  5.   


    如何判断这个方法调用是否频繁呢?1秒钟一次算频繁吗?或者1秒20次?即时性要求还是蛮高的。这个方法要求一天处理1万次,相当于8秒一个。这样的频率算高吗?能对方法用synchronized吗
      

  6.   

    这个方法调用很频繁的
    频繁的话  就不要这种方法了  你可以写一个简单的缓存  map或者其他集合去存储你的关键字段  然后每次添加时判断在内存中是否已经存在缓存  不存在则加入  否则pass  当然这个方法要的是内存容量  和你数据库的那个表的规模  综合判断是否采用这个方法
      

  7.   

    表里建个unique索引,怎么着都不会有重复