繁体   English   中英

Oracle 数据库与 Java JDBC 批量插入 - 在父级之前插入子级

[英]Oracle Database with Java JDBC Batch Inserts - insert child before parent

我有一个 Oracle (11) 数据库,其中包含一个具有自引用约束的表。

我有一些非常可怕的 java 代码,它已经愉快地运行了很长时间,它创建了两个插入的 BATCH 并运行它们。 这部分我们的 UNIT TEST 代码已经愉快地运行了多年。

奇怪的是 CHILD 的插入是在 PARENT 的插入之前添加到批处理中的。

我原以为那永远行不通。 但它确实

好吧,它适用于我的原始数据库,但不适用于新的“副本”。

所以我的桌子是这样的:

create table my_table (primary_key_id INT not null, related_id INT null);

alter table my_table add primary key (primary_key_id);

create index fk_my_table on my_table (related_id);

ALTER TABLE my_table ADD CONSTRAINT fkc_my_table FOREIGN KEY (related_id) REFERENCES my_table (primary_key_id);

JAVA代码是这样的:

public void wossupDoc(Connection con) throws Exception {      
  String sql = "INSERT INTO my_table (primary_key_id, related_id) values (?,?)";      
  try(PreparedStatement ps = con.prepareStatement(sql)){
    ps.setLong(1, 100);
    ps.setLong(2, 101);
    ps.addBatch();        
    ps.setLong(1, 101);
    ps.setNull(2, Types.NUMERIC);
    ps.addBatch();        
    ps.executeBatch();        
  }

(我创建了那个表并将这个 java 代码放入一个单元测试中,就像这样,所以我可以针对不同的数据库重复运行它)

因此,此代码在针对数据库“A”运行时有效,但在针对数据库“B”运行时不起作用。 所以,这是相同的代码,相同的 JDBC 驱动程序,但数据库连接属性中的 URL 不同......是的,它总是自动提交 = false。

我已经确认,在它工作的场景中,数据库表中有两条记录。

这些数据库是由相隔数年的两个不同的 DBA 创建的,它们几乎完全相同……但在某种程度上显然是不同的。

数据库版本: Oracle 数据库 11g 版本 11.2.0.3.0 - 64 位生产 Oracle 数据库 11g 版本 11.2.0.4.0 - 64 位生产

(是的,我知道这些是非常旧的版本,我正在尝试将我们的代码迁移到 Oracle 19 数据库,这就是我发现这种情况的方式)

有谁知道为什么这曾经有效? 是否有我可以调整以打开或关闭它的数据库/连接参数?

我真正的问题是我想知道主应用程序中是否有任何“批处理”代码可能会尝试这样做,因此过去几年一直在意外工作; 我不会知道,直到我们 go 使用新数据库并且用户开始做事......

当我进一步调查时,这看起来像是 Oracle 在 11.2.0.3.0 和 11.2.0.4.0 之间的行为变化。 检查 Oracle 的更新版本,行为是一致的 - 批次中的条目必须根据它们添加到批次的顺序有效。 看起来我必须接受这种行为并修复失败的代码/数据。 有道理,但对我来说还有更多工作。

鉴于 11.2 是 Oracle 的版本太旧,其他人应该不会遇到类似的问题。 感谢所有看过这个问题的人......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM