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

时间:2014-02-27 04:00:39

标签: 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的性能调优的示例或任何内容,因此任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

在我的原始帖子发布一年后,我正在重新检查具有性能问题的代码,并最终找到解决问题的方法!它不是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的改进,具体取决于用户定义类型中的属性数量。类型中的属性越多,我看到的改进就越多。