【问题标题】:ORA-00001: unique constraint: 1node vs 3nodeORA-00001: 唯一约束: 1node vs 3node
【发布时间】:2014-04-08 22:18:11
【问题描述】:

我们使用的是 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 中发生了什么,以及为什么它会减慢如此多的应用程序。我该如何诊断这种情况?

迈克尔

【问题讨论】:

    标签: sql oracle hibernate oracle11g


    【解决方案1】:

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

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

    而序列的当前值很简单

    my_seq.currval
    

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

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

    【讨论】:

      【解决方案2】:

      在 RAC 上使用服务级别扩展。创建一个“LOADER” 服务 RAC 端。仅在一个节点上启用此服务。并让 hibernate 使用这些服务“LOADER” 连接进行负载。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多