blowacoldwind
2008-11-28 11:21 阅读 575
已采纳

java 一次循环中,插入两条相同的数据

这是一个java写的程序,我在读到另一个系统的xml文件后,将数据插入到另一个系统的数据库,在插入前做判断,如果这条记录已经存在,那么更新,没有的话就插入,程序已经运行一年多没有问题了,最近有几个接口,都出现过一条数据重复插入的问题。

请各位给点意见,推测是哪方面的问题造成的,因为想重现错误非常难。

我的推测及根据:
1,数据库使用的是oracle,表的主键是一个自增序列,所以不能约束,重复值,但是一年多没有出过次类问题。
2,插入的两条数据的插入时间是相同的,例如有50条数据需要插入,那么循环50次,第一条插入的时间,可能会比最后一次插入的时间早1秒钟,其中第5条数据,在插入的时候居然是两条,数据包括插入的时间是一样的。这说明它应该是循环到此条数据时插入了两次。启动两个服务的可能性不大。
3,是网络问题造成的java和oracle之间有问题?
[code="java"]
for(int i=0;i<list.size();i++)
{
String tmp = list.getKey("id");
String sql = "select count(*) from tablename where id = '"+tmp+"'";
int count = executeQueuery(sql);
if(count<1)
insert(tmp);
else
update(tmp);
}
[/code]
以上代码是思路,大概就是这样子。是自动提交的,我怀疑在判断count<1的时候,连续插入了两次。有没有遇到此问题的,给点建议。
真是太郁闷了 等待中。
[b]问题补充:[/b]
int count = executeQueuery(sql); 这个方法没有问题,其实就是看看数据库有没有这条记录,而且插入两条的情况是在 count<1时,连续插入两条,应为插入的系统时间都是一样的。
[b]问题补充:[/b]
单线程的,没有使用多线程

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • 已采纳
    weixin_42511021 т 2008-11-28 12:48

    我觉得程序有问题的可能性比较大
    能不能把完整些的代码贴上来

    另外,
    1,表中既然有“插入的系统时间”,那么有没有“更新的系统时间”呢?
    2,list本身是否可能含有重复id呢?
    3,insert(tmp); 处理本身是个单纯的单表insert处理
    还是类似于以下这样的复合处理呢?
    [code="sql"]
    insert into tablename (
    ...
    )
    select
    ...
    from tablea
    inner join tableb on
    ...
    where ...
    [/code]
    如果是后者,是有可能产生重复数据的
    4,既然难于重现,可以考虑给表在id字段上加上唯一性约束,
    在这个处理上加上异常处理,用printStackTrace()把异常信息打出来
    这样在下次出现重复数据的时候,因为会报错
    可以比较容易定位出问题的地方

    点赞 评论 复制链接分享
  • hkliya hkliya 2008-11-28 11:27

    executeQueuery(sql);//我认为可能是这个方法有问题

    点赞 评论 复制链接分享
  • shoes_2003 shoes_2003 2008-11-28 11:46

    多线程还是单线程环境?

    点赞 评论 复制链接分享
  • hkliya hkliya 2008-11-28 11:50

    那照你的说法只能是insert(tmp);的问题了?

    点赞 评论 复制链接分享
  • wxwdtgy wxwdtgy 2008-11-28 12:30

    有没有用事物来控制?

    点赞 评论 复制链接分享
  • Eonianman Eonianman 2008-11-28 12:48

    你可以断点调试下...
    在项目里处理类似的业务:
    我是先根据条件去更新表,如果更新返回的行数为0的话,就insert.

    点赞 评论 复制链接分享
  • iteye_19016 iteye_19016 2008-11-28 13:26

    [code="java"]
    for(int i=0;i<list.size();i++)

    {

    String tmp = list.getKey("id");
    //你用的是ID自增 这条语句根本就不能判断重复的语句
    //或许是id不同 那值全部相同呢?
    //再说了id能重复么?
    //一定是在其他地方出了问题 有可能是页面缓存问题

    String sql = "select count(*) from tablename where id = '"+tmp+"'";

    int count = executeQueuery(sql);

    if(count<1)

    insert(tmp);

    else

    update(tmp);

    }

    [/code]

    [/code]

    点赞 评论 复制链接分享

相关推荐