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

时间:2018-02-07 16:11:22

标签: java oracle jdbc pool ucp

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

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

在正常情况下(选择或更新),与执行sql查询的时间相比,绑定变量的时间非常短。 但是,当我们使用PreparedStatement进行批处理执行时,我们会执行大量绑定变量,有时我们会通过调用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个迭代,有4个绑定变量。 在我们的生产批次中,我们有5 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的方法吗?

1 个答案:

答案 0 :(得分:0)

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