最近我们更改了连接池以迁移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反射api的方法吗?
答案 0 :(得分:0)
UCP中的代理机制已在12.2.0.1中得到改进,以使用动态代理,并且将提供比11.2.0.4中使用的Java代理更好的性能。您需要将ucp和jdbc(两者都必须在同一版本上)升级到12.2.0.1。