代码之家  ›  专栏  ›  技术社区  ›  user977208

是否可以在JDBC中批量创建Oracle Structs?

  •  1
  • user977208  · 技术社区  · 11 年前

    在我的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的性能调优的示例或任何东西,因此任何帮助都将不胜感激。

    1 回复  |  直到 11 年前
        1
  •  0
  •   user977208    10 年前

    在我最初的帖子发布一年后,我重新检查了存在性能问题的代码,最终找到了问题的解决方案!这不是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
    

    我还发现,结构描述符可以跨连接使用,因此理论上可以在应用程序中使用某种缓存或描述符池,即使它与最初创建时的连接不同。我没有运行测试来查看单个描述符是否是线程安全的,但我的最佳猜测是它不是。

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