Oracle 11g JDBC 预取键

Posted

技术标签:

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

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

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

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

我有什么选择?

【问题讨论】:

【参考方案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。

以上是关于Oracle 11g JDBC 预取键的主要内容,如果未能解决你的问题,请参考以下文章

java Map 根据Map的值(value)取键(key)

Guava中TreeRangeMap基本使用

字典常用语法

转: Maven 仓库中添加Oracle JDBC驱动(11g)

使用 JDBC 获取 Oracle 11g 的最后插入 ID

jdbc连接oracle11g出现ora-12505错误怎么解决?