【问题标题】:Caching Sequence from database to reduce db calls从数据库缓存序列以减少数据库调用
【发布时间】:2019-09-25 21:01:14
【问题描述】:

我们正在使用 JOOQ 开发批处理应用程序。应用程序需要调用序列来获取下一个值以保存大量记录。这肯定会对性能造成开销。 JOOQ 是否有任何内置方式来处理这个或任何其他替代方法来减少序列调用以缓存序列生成的值?

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 您是否只是假设这将是一个性能问题?还是你真的测试过?获取序列值通常非常快,除非您使用的是慢速网络(具有高延迟),否则我认为这不会是一个大问题(除非您需要每秒获取数百万个序列值)
  • @a_horse_with_no_name:在运行插入之前(使用 FORALL ),而不是通过触发器或身份或其他方式在每次插入时调用nextval。当然,我现在必须写一篇博文来支持这一点。现在,对于客户端往返,这种改进可能无关紧要,因为 JDBC 通信的开销要高得多......
  • @LukasEder 我会将nextval 直接放入INSERT 语句中;)(我们仍然不知道ManjuGH 是使用Oracle 还是Postgres 还是SQL Server 还是DB2)
  • @a_horse_with_no_name:我也愿意,但我当时的情况并没有提供这种可能性,因为必须在实际插入语句之前获取相当长的序列值。忘了为什么。 一个原因。

标签: java sql jooq


【解决方案1】:

我假设您计划获取例如一次将 100 个序列号输入客户端,以便在单个后续批处理操作中使用它们。这可以使用以下 jOOQ 语句来实现,例如在甲骨文中:

SELECT seq.nextval
FROM dual
CONNECT BY level <= 100;

或者使用 jOOQ

ctx.select(SEQ.nextval())
   .connectBy(level().le(100))
   .fetch();

根据您使用的 RDBMS,您需要将 connectBy() 语法替换为用于递归的标准 WITH 语法,或 PostgreSQL 中的 generate_series(),或者查询具有以下行数的表它是您需要的,作为一种解决方法。

【讨论】:

  • 详细信息:等效的 jOOQ 示例应使用 le() 而不是 lt(),但 SO 不接受一个字符编辑 :-)
  • @knutwannheden:以毫无意义的格式潜入 :) 感谢您的提示!
  • 有没有关于如何将上面提取的序列附加到批量查​​询@LukasEder 的示例?
  • @pppavan:不确定。但是你可以提出一个新问题,然后会有一个例子:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2013-05-20
  • 2019-01-28
  • 2015-09-25
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多