首页 > 解决方案 > 如何使用 Xquery 为 MarkLogic 实现自动递增数字主键

问题描述

如何在 MarkLogic 中实现Auto-Increment-Primary-Key RMDB 功能?

如果该键作为元素存储在配置 XML 文件中并使用 XQuery 库的“单例”模式来生成它,则会产生任何副作用。(多个 difffernet Xquery 代码将使用同一个库来生成唯一键。)我猜它不适用于 ML 集群?它可能仅适用于单个节点 ML。这会是多线程 Corbs 常规的瓶颈吗?

标签: modulequery-optimizationxquerymarklogic

解决方案


递增数字键通常被认为是一种反模式,因为它需要锁定和共享状态,这可能成为性能瓶颈。它会起作用,但它只会限制您的性能和吞吐量。

您应该真正考虑是否需要连续的数值,或者只需要唯一的数值。

您可以利用xdmp:random()它来生成随机的 64 位数值。它只是不会是顺序的。

或者,对于非数字唯一值,sem:uuid-string()

如果您真的,真的,需要自动递增的数字,那么您将需要一个文档来跟踪该数字,然后获取序列中的下一个值将涉及读取该文档并更新它的值(这将获得独占写锁)。您可以做得更精细,并让分片负责数字范围,以尝试获得一些额外的吞吐量和并行活动,而代价是插入时间不是 100% 连续的。你可以从 Twitter 雪花中汲取灵感:https ://github.com/twitter-archive/snowflake/tree/snowflake-2010


推荐阅读