我是用java从本地数据库中(oracle)提取数据后,封装,发送给远程服务器,然后远程服务器会返回发送结果代码。
我在主表中的每条数据都有一个字段显示其发送次数,还有一个字段显示发送结果。再有一张结果表,专门存储每条数据每次发送的结果和错误原因等详细信息。两张表是一对多关系。主表对每条数据是唯一的,当发送完,次数字段会增加1,发送结果也会更新 最新一次数据发送的结果。平时数据量小的时候完全没有问题,比如:第一次发送成功后,服务器返回1,代表发送成功。如果再发,服务器那边会校验已经发送过这条数据,就会返回2,代表数据以存在,况且我发送前有校验,当前数据如果在主表中结果字段里是1的,就不再发送。
我的程序是通过计划任务运行批处理自动执行的,平时都没问题。但有时候,似乎是当数据量大的时候,会出现一条数据同时重复发送了两次。查询主表和结果表后显示:主表发送次数字段为2,结果字段为1(成功),也就是这条数据在同一时间重复发送了两次,第二次是成功发送的。再查询结果表后,也发现有两条信息,每次的返回结果都为1,这两次的发送时间是一模一样的,例如都是05:02:13 (五时2分13秒),也就是两次都成功发送了。
按理说跑着一个程序,不该另外出现一个一模一样的进程重复一起运行和发送啊,但数据确实是重复发送出去了,服务器那边也收到了两条一模一样的数据,因为发送频率是同一时刻,所以那边校验都没起上作用,有用的话第二次肯定返回结果代码2。我觉得是不是缓存问题呢?又或者是同步什么的,我发送的那个方法一直是synchronization来修饰了的。求解决办法。不甚感激啊。
遇到类似的问题,请问楼主后面解决了吗?如果解决了是怎么解决的?
可能处理数据库的时候堆积了 ,多次请求 程序早已执行过校验逻辑后数据才发生改变.建议使用缓存设置synchronization 块来处理缓存 数据改变后清除缓存