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

2019-03-25 13:48|来源: 网路

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

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

我的推测及根据:
1,数据库使用的是oracle,表的主键是一个自增序列,所以不能约束,重复值,但是一年多没有出过次类问题。
2,插入的两条数据的插入时间是相同的,例如有50条数据需要插入,那么循环50次,第一条插入的时间,可能会比最后一次插入的时间早1秒钟,其中第5条数据,在插入的时候居然是两条,数据包括插入的时间是一样的。这说明它应该是循环到此条数据时插入了两次。启动两个服务的可能性不大。
3,是网络问题造成的java和oracle之间有问题?
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);
}

以上代码是思路,大概就是这样子。是自动提交的,我怀疑在判断count<1的时候,连续插入了两次。有没有遇到此问题的,给点建议。
真是太郁闷了 等待中。
问题补充:
int count = executeQueuery(sql);   这个方法没有问题,其实就是看看数据库有没有这条记录,而且插入两条的情况是在 count<1时,连续插入两条,应为插入的系统时间都是一样的。
问题补充:
单线程的,没有使用多线程

相关问答

更多
  • JAVA问题![2023-01-14]

    先看javase 数据库的视频最好结合se一起看。因为se是一切的基础。 然后看J2EE,这是企业级动态网站的开发技术。最后再看spring吧,这是J2EE的一门框架技术 主要作用是面向切面编程和依赖注入
  • 您好,提问者: 串口的话只能用JAVA调用,然后通过关闭、打开来判断。 另外Java是写不了串口的,需要C才可以。。。
  • 好像 MySQL 的触发器, 插入/删除自己这个表 会 导致 MySQL 发生异常。 方案1: 因此, 你这个情况, 可以尝试, 创建一个存储过程。 这个存储过程, 接受2个参数, 例如 uid1, uid2 然后存储过程内部, 插入2行数据。 外部程序 例如 PHP 什么的, 通过调用这个存储过程, 调用1次, 插入2行数据。 方案2: 另外折腾一个表, 叫 friend_all 向 friend 表插入1行数据的时候, 自动向 friend_all 表, 插入 2行数据。 这样最终, 你查询数据的时候, ...
  • byte(字节) 1(8位) (bit是比特位,一个字节占8个比特位) shot(短整型) 2(16位) int(整型) 4(32位) long(长整型) 8(64位) float(浮点型) 4(32位) double(双精度) 8(64位) char(字符型) 2(16位) boolean(布尔型) 1位 字节是系统分配内存的最小单位。boolean是分配一个字节,但是只有一个bit有用,其他无效置0
  • 把你想要执行的语句只做一次就是这样做的一种方式,但是,当然,假设语句出现在循环的结尾或开始处,并且不依赖于循环(在之前或之后)。 如果你有这样的事情: do { // do some stuff // one time condition // do some more stuff } while(condition); 你不会轻易地将这些信息拉出循环。 如果这是你的问题,我的建议是在一次性声明的周围放置某种条件,并在语句运行时更新条件。 像这样的东西: boolean hasRun = fa ...
  • 让我们假设你有这两个功能: y = m1*x + b1 y = m2*x + b2 为了找到x-axis的交点,我们做: m1*x+b1 = m2*x+b2 m1*x-m2*x = b2 - b2 x(m1-m2) = (b2-b1) x = (b2-b1) / (m1-m2) 要找到y,可以使用函数表达式并将x替换为其值(b2-b1) / (m1-m2) 。 所以: y = m1 * [(b2-b1) / (m1-m2)] + b1 你有(this.b - line. ...
  • 我该怎么办? 当我做我的测试和我运行我的项目时,我必须切换主电源? 您应该将要测试的代码分离到一个库项目中,该项目可以从您的目标应用程序和单元测试运行程序链接。 然后有两个项目提供main()函数: 一个用于目标应用程序,它只是将main()实现转发给MyTargetApp类成员函数的调用,例如MyTargetApp::run() 一个用于单元测试,调用TestRunner ,并包含所有测试套件和夹具类(包括MyTargetApp这些类)。 目标应用程序项目可以配置为不与cppunit库和测试套件/ fix ...
  • “GET /”请求自动拉动index.php。 页面上某处可能存在无效的图像SRC URL,脚本SRC或链接HREF。 这些可能会导致在后台对服务器发出定期查看请求,而不会意识到这一点。 查看所有HTML的URL,确保它们都是有效的服务器端文件。 也可能有服务器端重定向未知文件回到主页。 那或者你有一些JavaScript(可能是广告?)正在做一个ajax请求。 我们需要完整的资源来真正追踪这一点。 The "GET /" request is pulling index.php automatically ...
  • 基于事件的单线程guis的性质使得只有在事件完全处理后才能看到更改(从事件处理程序返回) 阻止事件派发线程将无济于事(甚至使整个应用程序无响应 ) 你应该使用一个计时器来模拟当时添加一个计时器,并在两者之间延迟 final String[] lines; for(int i=0; i<10; i++){ Timer t = new Timer(500*i,new ActionListener(){ int ind=i; void actionPerformed(Act ...
  • 我不相信我解决了我的问题。 时间戳是答案。 信用可以通过@xenolion建议时间。 我的想法是关于时间不同的先入为主的想法,但我只检查了消息的时间戳,并且相同的消息具有相同的时间戳。 I can't believe I solved my problem. The timestamp was the answer. Credit goes to @xenolion for suggesting time. My mind had preconceived notion about time being d ...