【问题标题】:Is it possible to create Oracle Structs in a batch in JDBC?是否可以在 JDBC 中批量创建 Oracle 结构?
【发布时间】:2014-03-30 07:21:24
【问题描述】:

在我的 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 的内容,因此我们将不胜感激。

【问题讨论】:

    标签: java performance oracle jdbc user-defined-types


    【解决方案1】:

    在我的原始帖子发布一年后,我重新检查了出现性能问题的代码,终于找到了解决问题的方法!这不是 STRUCT 的创建,我遇到的问题是我的 Struct 描述符的生命周期。我正在为每个批次创建一个结构描述符,结果证明这是一个缓慢的部分。

    实际上我有这样的事情:

    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
    

    我还发现 struct 描述符可以跨连接使用,所以理论上你可以拥有某种可以跨应用程序使用的缓存或描述符池,即使它用于与之前不同的连接最初创建。我没有运行测试来查看单个描述符是否是线程安全的,但我最好的猜测是它不是。

    进行上述更改确实有助于提高性能。通过重用描述符,我得到了 2X - 6X 的改进,具体取决于用户定义类型中的属性数量。类型中的属性越多,我看到的改进就越多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-23
      • 2012-06-07
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多