【问题标题】:Decrease number of calls to Oracle to retrieve new sequence [closed]减少调用 Oracle 以检索新序列的次数 [关闭]
【发布时间】: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


【解决方案1】:
  • 为什么要减少对应用程序的调用次数?面临任何争论?

你可以缓存你的序列,这将在内存中保留每个会话的序列号数,用于避免争用。

ALTER SEQUENCE customers_seq 
   CACHE 5; 

缓存 指定数据库预分配并保存在内存中以加快访问速度的序列值的数量。此整数值可以有 28 位或更少的数字。此参数的最小值为 2。对于循环的序列,此值必须小于循环中的值数。您不能缓存比给定序列号循环更多的值。因此,CACHE 允许的最大值必须小于由以下公式确定的值:

参考: https://docs.oracle.com/database/121/SQLRF/statements_6017.htm#SQLRF01314

【讨论】:

  • 但这在数据库缓存中。你不想为此通过网络。
  • 谢谢。我们也在增加序列的缓存,但我们仍然希望减少对 Oracle 的调用次数。这导致我们的开销很大。
  • 那么如果你不想去Oracle有序列值,你为什么要在数据库端实现序列?为什么不在应用程序中实现?你的号码真的要按序排列吗?不能是 UID 吗?
猜你喜欢
  • 1970-01-01
  • 2012-08-22
  • 2013-11-12
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2011-09-06
相关资源
最近更新 更多