java - 是否可以在 JDBC 中批量创建 Oracle Struct?

标签 java performance oracle jdbc user-defined-types

在我的 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/

相关文章:

c - 何时在程序中首先获取高速缓存行?

performance - SSL 性能影响

oracle - Devart dotConnect 适用于 Oracle 和企业库自定义提供商映射

java - 计算 future 头寸

java - 可能的 fatal error :No fonts found-while setting sheet. autoSizeColumn

javax.servlet.jsp.JspException : No getter method available for property 异常

用于批量插入语句的 oracle Alter Session NLS FORMAT - 未按预期运行

java - 仅在不成对时更换

mysql - 如何判断: DISTINCT or WHERE EXISTS?哪个更有效

java - 日期的 hibernate 条件