工作时候遇到了一个郁闷的问题:
web服务器:tomcat问题:
是这样的,现在有个数据接收方法doReceive,先用几个关键字段对表进行查询,发现搜不到数据,就将当前数据插入表。即已经判断重复数据了,但是发现表里还是出现了重复数据。但出现的频率不是很高
当时发生问题的条件:
请求访问doReceive的方法发现timeout了(应该是服务器长时间不响应),就不停的重发数据。看了下表里这2条数据的接收时间相差了4分钟请高手们帮忙看看怎么回事?有什么解决方案?我感觉应该是服务器在处理第一条数据时(服务器不响应,发生timeout),于是第二条重复数据过来了,此刻发现表里没有重复,于是这2条数据一起进去了。java
web服务器:tomcat问题:
是这样的,现在有个数据接收方法doReceive,先用几个关键字段对表进行查询,发现搜不到数据,就将当前数据插入表。即已经判断重复数据了,但是发现表里还是出现了重复数据。但出现的频率不是很高
当时发生问题的条件:
请求访问doReceive的方法发现timeout了(应该是服务器长时间不响应),就不停的重发数据。看了下表里这2条数据的接收时间相差了4分钟请高手们帮忙看看怎么回事?有什么解决方案?我感觉应该是服务器在处理第一条数据时(服务器不响应,发生timeout),于是第二条重复数据过来了,此刻发现表里没有重复,于是这2条数据一起进去了。java
2,插入数据前使用触发器
3,用merge把select和insert用一条sql写,应该就没有时间间隔了吧
1.给事务加锁(用ReentrantLock)
2.用insert if not exists防止插入重复记录,这样应该没有时间间隔了吧
3.先删除,再插入
4.先插,再删除这几个都能解决我的问题吗?我比较倾向于第三个
如何判断这个方法调用是否频繁呢?1秒钟一次算频繁吗?或者1秒20次?即时性要求还是蛮高的。这个方法要求一天处理1万次,相当于8秒一个。这样的频率算高吗?能对方法用synchronized吗
频繁的话 就不要这种方法了 你可以写一个简单的缓存 map或者其他集合去存储你的关键字段 然后每次添加时判断在内存中是否已经存在缓存 不存在则加入 否则pass 当然这个方法要的是内存容量 和你数据库的那个表的规模 综合判断是否采用这个方法