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



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

在我们的应用程序中,我们在UCP和OJDBC上具有与RAC兼容版本的OJDBC。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

高级问题是为什么?当唯一的_constraint发生时,3节点RAC中发生了什么,以及为什么它会减慢如此之大的应用。我如何诊断这种情况?

Michal

使用RAC上的服务级别缩放。创建RAC端的"加载程序"服务。仅在一个节点上使此服务处于活动状态。让Hibernate使用这些服务"加载器"连接进行负载。

解释是 - 非常模糊 - 每个集群节点都在掌握数据库地址空间的某些子集。当使用唯一约束时,每个节点必须从其母版节点中请求唯一索引的数据块。当发现了一个duplicer键并通过尚未进行的交易插入两个duplicit键。Oracle必须加入一个会话,然后等到另一个会话(属于另一个节点)进行或回滚。

如果您需要生成唯一值,则应让数据库为您执行。您可以创建一个称为序列的对象。然后,您仅通过

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

和序列的当前值只是

my_seq.currval

所以,如果您要插入记录...

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

最新更新