我正在寻找解决自定义序列生成问题的选项。让我通过举例说明我的问题:
假设有两个表公司和员工表,
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 生成“调查否”公司表。
要生成调查,不执行以下步骤:
在将上述方法转换为程序/逻辑之前,应牢记以下几点:
解决此自定义序列生成问题的正确方法是什么?
数据库级别的乐观锁定可能是个好主意。但这种方法可能会以某种方式降低性能。
是否存在可以处理上述问题并提高性能的内存序列生成?
欢迎提出意见/建议。
答案 0 :(得分:0)
保持LatestSequenceValue不变,但不是试图在每次插入时直接从它获取下一个序列值,而是将此任务委托给单个序列生成器。这个序列生成器将批量获取来自latestSequenceValue的序列,我的意思是它将lastSequenceValue增加500或类似的值而不是将值递增1.现在序列生成器单例具有500个值的范围,如果他正确分配永远不会导致重复的ID。现在要正确分配此值,单例需要以某种方式同步此操作。所以现在singelton确保单个应用程序不会创建重复的id,序列表将确保所有实例中的所有序列生成器都不会创建重复的id。
答案 1 :(得分:0)
我的一位同事给出了很好的答案。
<强>解决方案:强>
当持久存入数据库时,请使用组合_ [例如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等。所以我们用两个序列来管理所有事情。