【问题标题】:Oracle 11g JDBC prefetching keysOracle 11g JDBC 预取键
【发布时间】:2011-12-05 06:49:53
【问题描述】:

我的应用需要知道哪一行接收数据库中的哪个键。

我在读取提交隔离级别上使用 JDBC 并进行批量更新。因此无法使用 getGeneratedKeys 检索密钥。我的计划是以事务安全的方式从数据库中获取一系列 id,例如两个并行事务无法获取相同的密钥。

我可以编写一些 SQL 查询,将未来行数作为参数来获取 Oracle 11g 中的未来键列表吗?

我有什么选择?

【问题讨论】:

    标签: database oracle jdbc oracle11g auto-increment


    【解决方案1】:

    只是想补充:

    序列和表之间没有明确的关系。序列只是一种生成数字序列的机制。您可以假设一个序列永远不会产生重复值,仅此而已。不要假设顺序,并且绝对不要期望无间隙的序列。在 Oracle 中,序列是按照设计的方式完成的。通过遵循这些规则,并且不对序列的行为做任何其他假设,我们可以通过序列获得极具可扩展性的性能。请注意,一旦您尝试执行顺序或无间隙序列,您的性能就会受到严重影响。

    总结: 1.) 序列非常简单,而且非常快。 2.) 除了“没有重复”,不要假设你可以预测序列的行为。 3.) 序列是独立的对象,不依赖于表,可用于生成将在同一个表或许多不同表中使用的序列值。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      您可以为此目的使用序列:

      create sequence s;
      

      检索一个id

      select s.nextval from dual;
      

      或检索一系列 id:

      select s.nextval from dual connect by level <= 10;
      

      【讨论】:

      • 谢谢,您能详细说明一下这种方法的交易安全吗?对所有表的所有自动递增键来说,双重一些神奇的池塘吗?
      • 双重如何知道我需要哪个表的密钥?
      • 您可以创建任意数量的序列。每个表有一个序列并不少见。从对偶中选择 table1_seq.nextval;从对偶中选择 table2_seq;等等
      • 名为 DUAL 的表是数据字典中的一个小表,Oracle 数据库和用户编写的程序可以引用它来保证已知结果。此表有一列称为 DUMMY 和一行包含值 X。
      猜你喜欢
      • 1970-01-01
      • 2013-11-02
      • 2015-09-04
      • 2015-10-04
      • 1970-01-01
      • 2011-06-24
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多