【问题标题】:Can Oracle JDBC driver cache sequence valuesOracle JDBC 驱动程序能否缓存序列值
【发布时间】:2014-04-26 11:59:12
【问题描述】:
Oracle 序列值可以通过在创建序列时使用“缓存”选项缓存在数据库端。例如
CREATE SEQUENCE sequence_name
CACHE 1000;
将缓存多达 1000 个值以提高性能。
我的问题是这些值是否可以缓存在 oracle 驱动程序中。
在我的应用程序中,我想拉回一系列序列值,但不想为每个新值返回数据库。我知道 Hibernate 具有类似的功能,但我一直无法确切了解它是如何实现的。
任何建议将不胜感激。
谢谢,
马特
【问题讨论】:
标签:
oracle
caching
jdbc
driver
sequence
【解决方案1】:
不,您不能在一个会话中保留一批号码(如果我理解正确的话)。从性能的角度来看,设置正确的缓存值很可能使这可以接受。
如果您仍然坚持可以自己创建类似的功能 - 能够一次保留一个数字范围
【解决方案2】:
正如igr所说,oracle驱动似乎无法在java层缓存序列值。
但是,我通过在序列上设置较大的增量并自己生成键值来解决这个问题。序列的增量可以设置如下:
CREATE SEQUENCE sequence_name
INCREMENT BY $increment;
在我的应用程序中,每次执行sequence.nextval 时,我都会假设之前的$increment 值是保留的,并且可以用作唯一键值。这意味着对于生成的每个 $increment 键值,数据库都会被命中一次。
比如说$increment=5000,我们的起始序列值为1。当sequence.nextval第一次运行时,序列值增加到5001。然后我假设值2..5001被保留。然后在应用程序中使用 5000 个值(在我的用例中,它们用于表主键),一旦它们全部用完,sequence.nextval 再次运行以保留另外 5000 个值,并重复该过程。
我可以看到这种方法的唯一真正缺点是运行 ddl 的人在运行 nextval 和使用 $increment 生成值之间修改 $increment 的风险很小。鉴于这不太可能,而且在我的情况下,ddl 不会在运行时更新,因此该解决方案是可以接受的。
我意识到这并不能直接回答我提出的问题,但希望它对其他人有用。
谢谢,
马特。