我正在研究最新最好的Intershop 7.8.0.3,并且正在尝试实现一种新功能,该功能可生成一个独特的,人类可读的SKU。我的第一个想法是使用NumberSeriesProvider来实现该功能。但是,不幸的是,这个类被标记为已弃用,显然已被NumberSequenceProvider取代。遗憾的是,此功能存在巨大的文档空白。
到目前为止一切顺利。 NumberSequenceProvider还提供了一个方法nextValue(sequenceid)来提供下一个序列条目。我的问题是如何定义sequenceid。我已经看到有一个方法createSequence(...)可以用来这样做。此方法将序列添加到数据库,并将sequenceid存储在本地sequenceNumberGenerators缓存中。在没有调用createSequence(...)方法的情况下,序列是 - 据我所知 - 永远不可用于nextValue(sequenceId)方法,因此调用此方法将导致错误。
我不明白这应该如何在具有多个应用程序服务器的生产场景中工作。实际上我需要在每个服务器上调用createSequence(...)方法,以使序列在本地sequenceNumberGenerators缓存中可用。这种方法总是尝试在数据库中创建序列,如果序列已在先前的启动或并行应用程序服务器上创建,则会导致捕获异常。
它应该如何运作?
谢谢你,以及最好的问候
答案 0 :(得分:1)
AFAIK一旦创建 - 以编程方式或通过DBInit创建 - 序列将保留在数据库中。它由oracle sequence和BASICSERIESENTRY
表中的一行表示。服务器重新启动后序列将可用,无需重新创建它。
在服务器上调用下一个val将保留“系列”数字。这将在同步方法中发生 - 例如从50到100的数字将被保留并保存在内存中(同步),直到生成器耗尽间隔。之后,服务器将尝试从数据库中请求另一个系列。这是一个相当古老的优化,旨在减少数据库调用的数量。在每个服务器重新启动时,将再次调用数据库,以便保留新的系列。
以下是服务器在某些情况下的行为方式,例如,使用序列号生成器创建订单时。
场景1:单台服务器 - 创建3个订单,重新启动服务器,创建3个新订单。
可能的结果:订单号可能是50,51,52,100,101,102
场景2:并行服务器创建订单。
可能的时间结果:订单号可能是100,101,50,102,51,52
请注意,您可能有1到N个应用程序服务器,但只有一个DB来管理序列。
<强>更新强> 样品用法:
步骤1)创建序列
@Inject
private NumberSequenceProvider nsp;
public void createSeq()
{
nsp.createSequence(
"SO_1234567890",
"0000000",
"ABC",
1,
1,
Long.MAX_VALUE,
1,
false,
false,
50
);
}
以下是DB中发生的事情:
SELECT * FROM BASICSERIESENTRY WHERE IDENTIFIER = 'SO_1234567890'
IDENTIFIER NUMBERPATTERN SEQUENCENAME OCA
--------------- ---------------- ------------------------------ ----------------------
SO_1234567890 0000000 ABC 0
SELECT *
FROM user_sequences
WHERE sequence_name = 'ABC';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY CYCLE_FLAG ORDER_FLAG CACHE_SIZE LAST_NUMBER
------------------------------ ---------------------- ---------------------- ---------------------- ---------- ---------- ---------------------- ----------------------
ABC 1 9223372036854775807 1 N N 50 1
步骤2)重启服务器
第3步:试一试
String seq = Stream.
generate(() -> nsp.nextValue("SO_1234567890")).
limit(5).
collect(Collectors.joining(", "));
System.out.println("SEQUENCE: " + seq);
输出:
SEQUENCE: 0000001, 0000002, 0000003, 0000004, 0000005
故障排除:
1)NumberSequenceProvider
在报告任何Oracle错误时非常讨厌。因此,请检查错误日志中是否存在以下错误:ORA-04006: START WITH cannot be less than MINVALUE
2)激活提供程序实现的调试日志,并检查相关的调试消息(请参阅注释)。