【发布时间】:2018-03-01 12:38:59
【问题描述】:
在我们的应用程序中,每次创建新实体时,我们都会调用 Oracle 来获取实体 ID 的下一个序列。 我们为此使用 OracleSequenceMaxValueIncrementer。
但我们想减少对 oracle 的调用次数。
我正在考虑增加序列表上的“增量”值。现在是1。 因此,如果我们增加到 10,我们可以每 10 次调用 oracle,而不是每次需要新序列时。 我希望使用 OracleSequenceMaxValueIncrementer 在代码中获取“增量”值,但它不支持它,因此需要执行常规查询。
这是一个常见的解决方案吗,我猜是常见的问题?
附加信息: 我们用来获取下一个序列的服务被所有实体使用,每个实体都有一个不同的序列表,可以有不同的“增量”。这就是为什么我写了我将首先查询数据库以检索特定实体的“增量”。
【问题讨论】:
-
不,有两个序列(第二个在你的应用程序的内存中,数据库不知道)绝不是解决这个问题的常用方法。
-
@M.Prokhorov 实际上对于 JPA,序列增量通常是
100而不是1,并让 JPA 处理它以提高性能。当然,这与自己做并不完全相同,因为无论如何为实体提供 id 是 JPA 的业务。 -
实际上我在很多地方都看到过这种模式(应用程序中的增量并使用序列分配 x 插槽)。 1994 年,我们在 COBOL 银行系统中使用了它。只要所有应用程序都同意插槽大小,它就可以很好地工作。
-
@M.Prokhorov 我坚持认为,只要插槽大小定义明确,它就可以正常工作。每个应用程序通过递增数据库序列来保留一个范围。基本上将 1 添加到序列意味着您有 100 个值要使用,然后您必须获得一个新的序列值。只要所有应用程序都同意 100(例如),就没有额外的协调。向序列中添加一个是唯一需要的协调,并且性能会随着槽的大小而增加(所有其他条件都相同)。如果这是一个瓶颈(并且可能是),那么它是值得的。
标签: java oracle performance sequence