最近,我们将连接池更改为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。