【问题标题】: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 不会在运行时更新,因此该解决方案是可以接受的。

      我意识到这并不能直接回答我提出的问题,但希望它对其他人有用。

      谢谢,

      马特。

      【讨论】:

      • 所以这是一个 hilo 算法,但味道很花哨?
      猜你喜欢
      • 2012-10-05
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2016-12-10
      • 1970-01-01
      相关资源
      最近更新 更多