apache服务器的重复提交问题

最近在做一个大数据的处理,从数据库中批量的查询出约10w条数据,对每一条数据进行处理后再save到另一张表里。暴露出几个问题总结一下:


1.apache服务器的超时重发。由于我们后端首先进的是apache服务器,通过mod_jk转发至应用服务器的。apache的workers.properties配置文件中有一个属性

#worker.localnode.socket_timeout=60
#worker.localnode.retries=1

其中socket_timeout配置是表示后端处理超时的时间,
    retries
mod_jk向后端jboss重发的次数,retries=1标识不重发,期末线上没有配置默认为2.
如果后端代码处理时间超过1分钟,mod_jk会再次请求,相当于你的方法执行了2次。


可能带来的问题:

  • 后台耗时的定时任务被执行2
  • 数据订正时出现诡异的问题。
  • 生成、导出excelzip时,出现java.net.SocketException: Broken pipe这些诡异的问题
2. 大批量的数据循环插入可能导致数据库失去响应,取决于机器的配置。可能的解决方案:在循环中每隔n次插入Thread.sleep(200)。

3.可能的话,使用batchSave而不是save操作(前提是框架支持,如hibernate)。

4.在对大量数据进行处理尤其是生产环境的情况下,出于安全的考虑,一定要做好以下三点:
  • 任何情况下要做好应急回滚方案,如果这次不能回滚,那会造成更大的影响。
  • 在线下要尽可能的模拟线上情况,应该把数据全部导下来订正一遍,看是否会出现问题。
  • 对线上订正时,程序订正必须要做足够的log记录,记录出错的、成功的记录。事后补救可以定位。

猜你喜欢

转载自iamjordan.iteye.com/blog/1292334