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)
转: Maven 仓库中添加Oracle JDBC驱动(11g)