`
53873039oycg
  • 浏览: 843862 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java引用陷阱之数据重复保存问题解决小记

 
阅读更多

      问题提出:昨天在稽核数据时候发现主表和明细数据不一致,查看原始数据表发现同样存在主表和明细表数据不一致,明细表明显存在重复数据,分析重复数据,一条主表记录居然最多对应90条除了主键不一样其他全部相同的明细记录,最少的也有3条明细记录。

 

     问题解决过程:

     数据保存的接口是我提供的,业务开发的同事已经不在,只好自己去找问题根源了。

 

    1,首先确认问题是否存在。

    项目上线很久了,该业务一直运行良好,没有报障,所以我开始认为是统计有问题,再三在生产数据库确认,数据重复问题确实存在,不是统计的问题。

 

    2,找到代码位置,分析代码。

    首先得找到业务对应的代码的位置,原来业务不是我开发的,漫无目的的搜索毫无用处,只好反推,从我的数据保存接口往上,Ctrl+Alt+H,出来一堆的方法调用,一看傻眼了,到底那个出问题了。

   

     昨天下午4点开始到下班,看代码,结果很苦逼,代码不是自己写的,看起来老是怪怪的,怎么看都看不出问题,加上代码中的方法一个比一个长,一个方法从开始到结束大部分长度在600行左右,把我看晕了。

  

    今天上午继续看代码,实话实说,我没看出问题,都看晕了,唯一看出的是代码中没有重复保存问题存在。

   

    3,从页面上找到原始方法调用

    代码没看出问题,只好在页面上把业务一个一个尝试,之所以没有一开始就从页面上点击,是因为我对业务怎么操作的不清楚,现在只剩下这种方法了,不清楚业务怎么操作的,只好请教测试人员询问业务操作流程,被测试鄙视了。

 

     在页面上造了一笔测试数据,点击提交,查看url方法找到调用的原始方法名称,定位代码位置,第一次没有打断点,查看数据库,数据正常,没有重复数据。

 

     换一种业务操作,试下批量操作,第一次只提交了一条记录,马上找到了方法名称,在方法上打算断点,debug运行,批量操作提交只提交1条记录,debug发现情况正常。

 

     难道不是这个业务,不应该,就这2种操作,再测试下,这次批量提交2条测试记录,运行后没看出问题,查看数据库一看,数据库居然不止2条记录,看来就是这个业务出问题了。

 

   4,修改代码

    原始方法找到了,保存方法经测试没有问题,问题在上面,把保存方法里面的内容注释掉,再次debug,发现了一些端倪。

    1,第1条记录时候没有问题。

    2,第2条记录保存前居然能看到第一条记录的数据。

    初步怀疑是引用引起的。原始代码简化后如下:

   

List<ThirdJavaBean> orderItemList = new ArrayList<ThirdJavaBean>();
for(int i=0;i<list.size();i++)
{
   ThirdJavaBean ob=new ThirdJavaBean();
   ob.setXXX();
   orderItemList.add(ob);
   ThirdJavaBean[] tbs=new ThirdJavaBean[orderItemList.size()];
   for(int j=0;j<orderItemList.size();j++)
   {
      tbs[j]=orderItemList.get(j);
   }
   XXSV.saveJavaBean(tbs);
}

   

    -----上面for循环是j<orderItemList.size();自己手写的代码,写成了i,谢谢指正。

 

    不要问我代码为什么这么写,这不是我写的,眼尖的朋友也行发现了问题所在,第4行附近orderItemList 出问题了,由于对象引用,每次循环,下一次时候都能拿到上一次的数据,这是一个由于粗心引起的非常隐蔽的错误。

 

    解决方法如下:

    每次for循环里面都重新new 一个orderItemList,这样就不会出现上面的问题了。

   

    结论:

    1,对象在使用=赋值时候,小心原始对象的引用问题,最好每次重新new一个对象。

    2,论熟悉业务的重要性。

    3,错误很低级,发现不容易。

   

 

   

0
0
分享到:
评论
7 楼 深蓝de星球 2014-03-07  
   去年改过这样类似的bug:每次迭代时使用的是上一次的对象数据
这样写的同事估计是被公司的编码建议给糊弄了,说是for循环内部最好不要new对象.

6 楼 xugangqiang 2014-03-07  
53873039oycg 写道
xugangqiang 写道
没有单元测试代码?

上线前可能没有测出这个bug,这个bug只有数据2条以上才触发

单元测试的覆盖率不够
5 楼 53873039oycg 2014-03-07  
xugangqiang 写道
没有单元测试代码?

上线前可能没有测出这个bug,这个bug只有数据2条以上才触发
4 楼 xugangqiang 2014-03-07  
没有单元测试代码?
3 楼 53873039oycg 2014-03-07  
last_forever 写道
引用

for(int j=0;i<orderItemList.size();j++
   { 
      tbs[j]=orderItemList.get(j); 
   }

这个地方什么意思?

我手写的,写错了第二个是j<orderItemList.size(),谢谢指出错误。
2 楼 last_forever 2014-03-07  
引用

for(int j=0;i<orderItemList.size();j++
   { 
      tbs[j]=orderItemList.get(j); 
   }

这个地方什么意思?
1 楼 lituo20 2014-03-07  
这个问题很好啊,我深有体会,记得我也犯过这样的错误。这确实是个坑

相关推荐

    java小记.rar

    作者可能讨论了如何部署应用到这些容器,解决常见的启动、性能和安全问题。 最后,开发过程中的一些工具和实践,比如Maven或Gradle构建工具,Git版本控制,IntelliJ IDEA或Eclipse IDE的使用,以及单元测试和集成...

    数据结构习题总结 拾荒小记

    《数据结构习题总结 拾荒小记》是一份以C++语言实现的数据结构算法集,涵盖了严蔚敏教授经典教材中的80%算法。这份资料旨在帮助学习者巩固和深化对数据结构的理解,同时也为社区提供了一份宝贵的资源。 首先,让...

    数据结构 代码集 拾荒小记

    自己写的一本数据结构程序集,电子书chm版,实现了严蔚敏版的数据结构中80%以上的算法,书中100% 的代码都是由个人编写. 是本人学习编程,学习数据结构的一个总结. 取名为拾荒小记 亦为总结,亦为追忆

    阿里大数据分析平台使用小记

    阿里大数据分析平台使用小记 阿里大数据分析平台是阿里巴巴集团旗下的数据分析平台,提供了大数据处理、存储和分析的能力。该平台主要应用于天池大数据竞赛平台,提供了一些使用经验和教程,但不是完整的开发使用...

    java 中时间和日期处理的小记

    时间和日期中常用到的几个类: java.util.Date, java.util.Calendar, java.util.GregorainCalendar, java.text.DateFormat, java.text.SimpleDateFormat

    Java transient关键字使用小记

    在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...

    Linux boost库安装、编译问题小记

    环境: Linux s12084 2.6.9-67.ELsmp #1 SMP Wed ...小记一下。以备以后参考。  boost 库做得真好。在windows 平台, linux 平台下编译都很顺利。hp aCC 也宣称对 boost 1.35 完全支持 。  全部编译是很痛苦的过程

    数据字典-小记及用户部分1

    数据字典是数据库设计的重要组成部分,它记录了系统中各个数据元素的详细信息,包括数据的名称、描述、数据类型、长度以及可能的取值范围等。以下是对标题"数据字典-小记及用户部分1"中所提及的数据元素进行的详细...

    linux+java+python3+numpy+stl的3d打印小记

    在本项目中,我们将探索如何利用Linux操作系统,Java编程语言,Python3,NumPy库以及STL文件格式来实现3D打印技术。这是一个跨学科的综合应用,涉及到计算机科学、软件开发以及制造技术。 首先,Linux是开源的操作...

    sql loader用法小记

    这篇“sql loader用法小记”可能是博主对SQL Loader使用经验的总结和分享,虽然描述中没有具体信息,但从标签“源码”和“工具”可以推断,内容可能涉及到SQL Loader的基本操作、配置文件以及可能遇到的问题。...

    xstream使用小记

    《Xstream使用小记》 Xstream是一款Java库,它提供了简单且强大的方式来序列化和反序列化Java对象到XML,以及从XML回转换为Java对象。在本文中,我们将深入探讨Xstream的核心概念、使用场景以及如何通过实例进行...

    android开发小记

    在“android开发小记”这个主题中,我们可以深入探讨Android应用程序开发的相关知识,特别是通过查看提供的压缩文件中的代码示例。这些文件名如lesson_8_code.zip至lesson_20_codel.zip,以及不同的Mp3Player版本,...

    whyu小记-ETL数据加载策略.pdf

    ETL(Extract, Transform, Load)数据加载策略是数据仓库和数据集成项目中至关重要的一环。ETL涉及从源系统中提取数据、对数据进行清洗、转换和整合,最后加载到目标系统的过程。本文主要讨论在OLTP(Online ...

    Hessian 的字段序列化小记

    本文将围绕"Hessian的字段序列化小记"这一主题,深入探讨Hessian的工作原理、序列化过程以及其在实际应用中的价值。 Hessian的目标是通过减少数据传输的体积来提高网络通信的效率。相比于XML和JSON等文本格式,...

    Go-什么车最适合跑滴滴——数据化思维小记

    在探讨“Go语言在滴滴出行中的应用以及如何利用数据化思维选择最适合跑滴滴的车型”这一主题时,我们可以深入理解Go开发在大数据处理和机器学习库中的重要性,以及如何运用这些工具解决实际问题。 Go语言,也被称为...

    Flex整合J2EE开发小记+源码下载

    标题中的“Flex整合J2EE开发小记+源码下载”揭示了本文的主题,即如何将Adobe Flex技术与Java EE(J2EE)平台相结合,进行Web应用的开发。Flex是一种用于构建富互联网应用程序(RIA)的开源框架,它允许开发者创建...

    spark优化实践小记

    数据倾斜是Spark作业中常见的性能问题之一,尤其是在进行Shuffle操作时更为突出。文档中提到了几种有效缓解数据倾斜的方法: 1. **使用随机值处理Join操作中的空值**:当参与Join操作的一方包含大量的空值时,可以...

    J2EE开发之常用开源项目小记

    - **JSTL**:JavaServer Pages Standard Tag Library,用于增强JSP页面的功能,提供了许多内置标签,被认为是最快的JSP标签库之一。 - **富客户端库**:如DOJO Widgets、YUI、FCKEditor和Coolest日历控件,这些库...

Global site tag (gtag.js) - Google Analytics