gpt4 book ai didi

java - 绑定(bind)变量期间的 Oracle UCP 性能问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:23:39 25 4
gpt4 key购买 nike

最近我们更改了连接池以迁移 Oracle UCP。在迁移之前,我们使用了嵌入了oracle jdbc驱动程序(ojdbc6.jar)的池。

我们的问题是绑定(bind)变量阶段的运行时间。使用 UCP,绑定(bind)变量的时间比旧池长,因为它使用内省(introspection)。

在正常情况下(选择或更新),绑定(bind)变量的时间与执行 sql 查询的时间相比非常短。但是,当我们使用 PreparedStatement 进行批处理时,我们会做很多绑定(bind)变量,有时我们会通过调用 pst.excuteBatch() 来运行查询。

作为示例,这是一个小程序,用于说明两个池的运行时间。

PreparedStatement ppst = connection.prepareStatement(INSERT_SQL);

...

private long setParam(PreparedStatement prepStmt) throws SQLException {
long d = 0;
for (long i = 1; i <= 750 000; i++) {
int index = 1;
prepStmt.setString(index++, "1470");
prepStmt.setTimestamp(index++, new Timestamp(System.currentTimeMillis()));
prepStmt.setInt(index++, 1);
prepStmt.setObject(index++, String.valueOf(i));
prepStmt.addBatch();
}
prepStmt.clearBatch();
return d;
}

使用嵌入了 ojdbc6 驱动程序的旧池,耗时为:7.653 秒。
对于 UCP 池,耗时是:10.92 秒。

在这个例子中,我们有 750 000 次迭代和 4 个绑定(bind)变量。在我们的生产批处理中,我们有 50 000 000 次迭代。所以绑定(bind)变量的耗时很长,我们的批处理时间也变长了。

技术信息:
旧池:ojdbc6.jar (11.2.0.3.0)
新池:ojdbc6.jar (11.2.0.3.0) + ucp.jar (11.2.0.4.0)

我们分析了绑定(bind)变量阶段:

  • 使用新的池 UCP,每个变量都与速度较慢的 java relection api 绑定(bind)。
  • 在旧池中,每个变量都直接与变量类型的相应方法绑定(bind)。

我们如何提高 UCP 池绑定(bind)变量的性能?您知道禁用 java 反射 api 的方法吗?

最佳答案

UCP 中的代理机制在 12.2.0.1 中得到了改进,可以使用动态代理,并将提供比 11.2.0.4 中使用的 Java 代理更好的性能。您需要将 ucp 和 jdbc(两者必须是同一版本)升级到 12.2.0.1。

关于java - 绑定(bind)变量期间的 Oracle UCP 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48668363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com