ORA-00001:唯一约束:1node vs 3node

时间:2014-03-06 10:32:30

标签: sql oracle hibernate oracle11g

我们正在使用ORACLE 11.2.0.3.0,配置为3节点RAC。

在我们的应用程序中,我们通过UCP和OJDBC与RAC兼容版本进行休眠。 Hibernate使用一些序列来获取数据库中任何记录的ID。我的数据库我们有UNIQUE_CONSTRAINT(some_value)表。它用于同步许多应用程序实例,应用程序中的每个事务都需要此表中的唯一行。因此,应用程序A尝试在此表中插入(some_value =“A”),如果其他应用程序已插入行(some_value =“A”),则第一个实例将违反ORA-00001唯一约束,并使用其他值重试此值(some_value) = “B”)。

UNIQUE_CONSTRAINT经常发射。像8tx中的一个。

我们进行了两次测试:

service pinned to one node: response time avg 6ms
service on all 3 nodes: response time avg 800-1000ms

高层次的问题是为什么?发生UNIQUE_CONSTRAINT时,3节点RAC中发生了什么,以及为什么它会减慢这么多应用程序的速度。我该如何诊断这个病例?

米甲

2 个答案:

答案 0 :(得分:0)

在RAC上使用服务级别缩放。在RAC方面创建“LOADER”服务。仅在一个节点上激活此服务。让hibernate使用这些服务“LOADER”连接来加载。

解释是 - 非常模糊 - 每个集群节点正在掌握数据库地址空间的某些子集。使用唯一约束时,每个节点必须从其主控节点请求唯一索引的数据块。当找到双重密钥时,两个重复密钥都是通过尚未提交的事务插入的。 Oracle必须将一个会话排入队列,并让它等到另一个会话(属于另一个节点)提交或回滚。

答案 1 :(得分:0)

如果您需要生成唯一值,您应该让数据库为您执行此操作。您可以创建一个名为SEQUENCE的对象。然后,您只需通过

获取序列的下一个值
my_seq.nextval

序列的当前值只是

my_seq.currval

所以如果你要插入记录......

insert into my_table( my_seq.nextval, 'xxx', yyy, 123, ... )