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

时间:2014-01-16 10:41:42

标签: 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
----------------------------------------------------------

每当员工加入公司时,他都会被要求完成公司特定的调查,调查结束后,根据 LatestSequenceValue 生成“调查否”公司表。

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

  1. 从公司表格中读取特定于公司的当前序列值( LatestSequenceValue
  2. 将序列计数增加1
  3. 使用此递增值以“ EmployeeSurveyNo
  4. 登录员工表
  5. 此外,更新公司表格中的增量值( LatestSequenceValue ),以便下次调查得到正确的顺序。
  6. 在将上述方法转换为程序/逻辑之前,应牢记以下几点:

    1. 可以在群集环境中部署应用程序
    2. 应用程序支持多线程
    3. 最后但并非最不重要的是,应用程序应该在一小时内进行50K调查。
    4. 解决此自定义序列生成问题的正确方法是什么?

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

      是否存在可以处理上述问题并提高性能的内存序列生成?

      欢迎提出意见/建议。

2 个答案:

答案 0 :(得分:0)

保持LatestSequenceValue不变,但不是试图在每次插入时直接从它获取下一个序列值,而是将此任务委托给单个序列生成器。这个序列生成器将批量获取来自latestSequenceValue的序列,我的意思是它将lastSequenceValue增加500或类似的值而不是将值递增1.现在序列生成器单例具有500个值的范围,如果他正确分配永远不会导致重复的ID。现在要正确分配此值,单例需要以某种方式同步此操作。所以现在singelton确保单个应用程序不会创建重复的id,序列表将确保所有实例中的所有序列生成器都不会创建重复的id。

答案 1 :(得分:0)

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

<强>解决方案:

  1. 创建一个将用于所有公司的Oracle序列 - 此序列将用于生成序列的主要版本部分。
  2. 在应用程序代码中创建一个运行序列(一些具有特定长度的随机值),并将其用作序列的次要版本部分。
  3. 当持久存入数据库时​​,请使用组合_ [例如100_001]以唯一标识记录。这样我们就不必为n#公司创建n#的Oracle序列。我们可以创建一个,它将为所有公司生成序列的主要版本部分。但是,如果所有公司数据都托管在同一数据库中,这将起作用。只是一个想法。

    通过这种方式,我们可以避免创建数千个序列,并且可以为每个公司设置唯一性。

    SQL> create sequence s1 start with 1000;
    
    Sequence created.
    
    SQL> create sequence s2 start with 6000;
    
    Sequence created.
    
    SQL> select to_char(s1.nextval)||'-'||to_char(s2.nextval) from dual;
    
    TO_CHAR(S1.NEXTVAL)||'-'||TO_C
    --------------------------------        
    1000-6000
    
    SQL> select to_char(s1.currval)||'-'||to_char(s2.nextval) from dual;
    
    TO_CHAR(S1.CURRVAL)||'-'||TO_C
    ------------------------------        
    1000-6001
    

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