重复,因为Oracle太快或多线程?

时间:2013-04-03 11:31:54

标签: java performance web-services oracle11g duplicates

我遇到了通过Java Web服务到达我们数据库的重复记录的问题,我认为这与Oracle处理线程有关。

使用我们制作的iPhone应用程序,用户将鸟类观察添加到他们度假时访问的新网站。他们在“新站点A”创建了三个记录(例如)。 iPhone将这三个记录中的每一个打包成包含相同日期和位置详细信息的单独JSON字符串。

在上载时,Web服务会遍历每个JSON字符串。
迭代/观察1.它检查数据库以查看该站点是否存在,如果不存在,则创建一个新站点并将观察结果添加到挂起表中。
迭代/ Obs 2.该站点现在应该存在于数据库中,但是迭代1中的数据库站点检查找不到该站点,并且创建了第二个新站点。
迭代/ Obs 3.检查现有站点NOW WORKS,第三个观察结果附加到现有站点之一。因此,Web服务和数据库代码确实有效。

Web服务在每次迭代结束时提交。

第二次迭代的原因是由于Java调用后Oracle代码中的延迟导致数据库中没有找到新站点,因此在迭代1真正完成时它已经开始处理迭代2,或者Oracle是否可能在单独的线程上运行每次迭代?

我们想到的一个解决方案是在Web服务中使用Thread.sleep(1000),但我宁愿不惩罚iPhone用户。

感谢您提供的任何帮助。 伊恩

2 个答案:

答案 0 :(得分:6)

对我来说听起来像是一场竞争。可能你的观察1和2彼此非常接近,所以当2到达时1仍在处理。 Oracle符合ACID标准,这意味着您的观察事务2无法看到事务1中所做的更改,除非在事务二开始之前已完成

如果您需要检查然后创建功能,则最好在后端的单个点同步此功能。

此外,在数据库中添加约束以避免不惜一切代价重复。

答案 1 :(得分:1)

这不是Oracle问题; Thread.sleep将是一个糟糕的解决方案,特别是因为你不知道根本原因。

您的描述令人困惑。是否在一个HTTP请求中发送了三个JSON字符串?订单是否重要,或处理其中任何一个是否首先为后续的位置设置新位置?

什么是"挂桌"?

这是位置和观察之间的亲子关系吗?那么工作单元是将一个新位置插入到父表中,然后在子表中将三个观察结果引回到父表中?

我认为您的查询存在问题,以及他们如何撰写。我可以向你保证,Oracle对于这个微不足道的问题已经足够快了。如果它可以处理纳斯达克交易费率,它可以处理您的网站。

我以这种方式写你的DAO观察:

public interface ObservationDao {
    void saveOrUpdate(Observation observation);
}

将所有逻辑保留在DAO中。在servlet外部进行测试并将其放在一边。一旦你工作,你就可以专注于网络应用程序。