最近,我们更改了连接池以迁移到Oracle UCP。在迁移之前,我们使用了与oracle jdbc驱动程序(ojdbc6.jar)嵌入的池。
我们的问题是绑定变量阶段的运行时间。对于UCP,绑定变量的时间比旧的池要长,因为它使用了内省。
在正常情况下(select或update),绑定变量的时间与执行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秒.
在这个例子中,我们有75万个带有4个绑定变量的迭代。在我们的生产批次中,我们有5万次迭代。因此绑定变量所需的时间很长,并且我们的批处理时间已经增长。
技术信息:
旧池: ojdbc6.jar (11.2.0.3.0)
新池: ojdbc6.jar (11.2.0.3.0) + ucp.jar (11.2.0.4.0)
我们分析了绑定变量阶段:
如何提高UCP池的绑定变量的性能?您知道如何禁用java反射api的使用吗?
发布于 2018-03-22 10:15:54
UCP中的代理机制在12.2.0.1中得到了改进,以使用动态代理,并将提供比11.2.0.4中使用的Java代理更好的性能。您需要将ucp和jdbc (都必须在同一个版本上)升级到12.2.0.1。
https://stackoverflow.com/questions/48668363
复制相似问题