在我的 Java 应用程序中,我通过 JDBC 发送批量记录以保存到 Oracle 数据库中。我的设置与此页面非常相似:Upscaling your JDBC app using Oracle object type collection 。唯一的区别是我调用存储过程而不是直接插入。
您会在该示例中注意到,每次创建新的 STRUCT 时,参数之一就是连接:
structEmployee[i] = new oracle.sql.STRUCT(descEmployee, conn, empValues);
我们注意到创建这些结构需要很长时间,特别是当数据库位于欧洲而应用程序在美国运行时。当数据库和应用程序都位于伦敦时,速度会加快,但让我认为我们正在进行数据库调用来创建每个新结构。
这是真的吗?如果是这样,有没有办法批量处理以便速度更快?我在 Oracle 文档中找不到任何示例或任何讨论从 Java 创建 STRUCTS 的性能调整的内容,因此我们将不胜感激。
最佳答案
在我最初发表文章一年后,我重新检查了存在性能问题的代码,终于找到了问题的解决方案!这不是结构的创建,我遇到的问题是结构描述符的生命周期。我正在为每个批处理创建一个结构描述符,结果发现这是缓慢的部分。
实际上我有这样的事情:
foreach batch of 1000 records
create struct descriptor
foreach record in batch
create struct and add to array
end foreach
create array descriptor
create array from struct array
execute stored proc
end foreach
最后我把它改成了这样:
create struct descriptor
create array descriptor
foreach batch of 1000 records
foreach record in batch
create struct
end foreach
create array from struct array
execute stored proc
end foreach
我还发现结构描述符可以跨连接使用,因此理论上您可以拥有某种可以跨应用程序使用的缓存或描述符池,即使它与与原来不同的连接一起使用最初创建的。我没有运行测试来查看单个描述符是否是线程安全的,但我最好的猜测是它不是。
进行上述更改确实有助于提高性能。通过重用描述符,我获得了 2 到 6 倍的改进,具体取决于用户定义类型中的属性数量。类型中的属性越多,我看到的改进就越多。
关于java - 是否可以在 JDBC 中批量创建 Oracle Struct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22058760/