多线程和集群环境中的自定义序列生成

Nar*_*rma 5 java oracle sequence

我正在寻找解决自定义序列生成问题的选项.让我通过举个例子来描述我的问题:

比方说,公司和员工表有两个表,

Table: Company
-----------------------------------------------
CompanyId  | CompanyName | LatestSequenceValue
-----------------------------------------------
    c1     |     XYZ     |   100 
    c2     |     ABC     |   150
-----------------------------------------------
Table: Employee
----------------------------------------------------------
EmployeeId | EmployeeName  | CompanyId | EmployeeSurveyNo
----------------------------------------------------------
    e1     |     NVERMA     |    c1    |   101 
    e1     |     DAVID      |    c1    |   102
    e2     |     VGUPTA     |    c2    |   151
    e2     |     MAC        |    c2    |   152
----------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

每当员工加入公司时,他都会被要求完成公司特定的调查,并在完成调查后,根据公司表格中的LatestSequenceValue生成" 调查编号 " .

要生成调查,不执行以下步骤:

  1. 从公司表中读取特定于公司的当前序列值(LatestSequenceValue)
  2. 将序列计数增加1
  3. 使用此递增值以" EmployeeSurveyNo " 身份登录员工表
  4. 此外,更新公司表(LatestSequenceValue)中的递增值,以便下一次调查应该得到正确的顺序.

在将上述方法转换为程序/逻辑之前,应牢记以下几点:

  1. 应用程序可以部署在集群环境中
  2. 应用程序支持多线程
  3. 最后但同样重要的是,应用程序应该在一小时内完成50K调查.

什么应该是解决这个自定义序列生成问题的正确方法?

数据库级别的乐观锁定可能是个好主意.但这种方法可能会以某种方式降低性能.

有没有内存序列生成可以处理上述问题并提高性能?

我们非常欢迎您的想法/建议.

Nar*_*rma 0

我的一位同事对此给出了很好的答案。

\n\n

解决方案:

\n\n
    \n
  1. 创建一个 Oracle 序列,该序列将用于所有公司 \xe2\x80\x93 该序列将用于生成序列的主要版本部分。
  2. \n
  3. 在应用程序代码中创建一个运行序列(具有特定长度的一些随机值)并将其用作序列的次要版本部分。
  4. \n
\n\n

当持久化到数据库中时,使用组合_[例如100_001]来唯一标识一条记录。这样我们就不必为 n # 个公司创建 n # 个 Oracle 序列。我们可以创建一个,它将为所有公司生成序列的主要版本部分。但是,如果所有公司数据都托管在同一数据库中,则这将起作用。只是一个想法。

\n\n

通过这种方式,我们可以避免创建数千个序列,同时又能够为每个公司提供独特性。

\n\n
SQL> create sequence s1 start with 1000;\n\nSequence created.\n\nSQL> create sequence s2 start with 6000;\n\nSequence created.\n\nSQL> select to_char(s1.nextval)||'-'||to_char(s2.nextval) from dual;\n\nTO_CHAR(S1.NEXTVAL)||'-'||TO_C\n--------------------------------        \n1000-6000\n\nSQL> select to_char(s1.currval)||'-'||to_char(s2.nextval) from dual;\n\nTO_CHAR(S1.CURRVAL)||'-'||TO_C\n------------------------------        \n1000-6001\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于下一家公司,您可能有 1001-6001 等。所以我们用两个序列来管理一切。

\n