绑定变量期间的Oracle UCP性能问题



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

我们的问题是结合变量阶段的经过的时间。使用UCP,绑定变量的时间大于旧池,因为它使用内省。

在普通情况(选择或更新(中,与SQL查询执行时间相比,绑定变量的时间很小。但是,当我们使用准备施工进行批处理执行时,我们会执行很多绑定变量,有时我们通过调用pst.cutebatch((。

来运行查询。

作为一个例子,这是一个小程序,可以用两个池说明弹性的时间。

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 sec。
使用UCP池,经过的时间为: 10.92 sec

在此示例中,我们有750 000次迭代,具有4个绑定变量。在我们的生产批次中,我们进行了500 000 000迭代。因此,经过的绑定变量的时间很长,我们的批处理时间已经长大。

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

我们介绍了绑定变量阶段:

  • 使用新的池UCP,每个变量都与较慢的Java Relection API相结合。
  • 在旧池的情况下,每个变量都用变量类型的相应方法直接二变。

如何提高UCP池的绑定变量的性能?您知道一种禁用Java反射API使用的方法吗?

UCP中的代理机制在12.2.0.1中得到了改进,以使用动态代理,并且将提供比11.2.0.4中使用的Java代理更好的性能。您将需要升级UCP和JDBC(都必须在同一版本上(至12.2.0.1。

相关内容

  • 没有找到相关文章

最新更新