Java Apache Tomcat JDBC连接池在批处理\批量插入时性能不佳
我最近将ApacheTomcatJDBC连接池合并到我的应用程序中(使用MySQL数据库)。我以前尝试过使用ApacheDBCP,但不喜欢它的结果,tomcat实现似乎适合我的需要,即使我运行一个独立的java应用程序,并且根本不使用tomcat 最近,我在执行批处理(又称批量)插入查询时遇到了一个巨大的性能问题 我有一个流程,在这个流程中,我以批处理的方式将大约2500条记录插入到一个表中。使用jdbc连接池时需要花费很长时间,而恢复为每个查询打开连接(无池)时需要几秒钟 我编写了一个小应用程序,在同一个表中插入30行。池化时需要12秒,不池化时需要约800毫秒 在使用连接池之前,我使用Java Apache Tomcat JDBC连接池在批处理\批量插入时性能不佳,java,tomcat,jdbc,bulkinsert,jdbc-pool,Java,Tomcat,Jdbc,Bulkinsert,Jdbc Pool,我最近将ApacheTomcatJDBC连接池合并到我的应用程序中(使用MySQL数据库)。我以前尝试过使用ApacheDBCP,但不喜欢它的结果,tomcat实现似乎适合我的需要,即使我运行一个独立的java应用程序,并且根本不使用tomcat 最近,我在执行批处理(又称批量)插入查询时遇到了一个巨大的性能问题 我有一个流程,在这个流程中,我以批处理的方式将大约2500条记录插入到一个表中。使用jdbc连接池时需要花费很长时间,而恢复为每个查询打开连接(无池)时需要几秒钟 我编写了一个小应用程
com.mysql.jdbc.jdbc2.optional.MysqlDataSource
作为数据源。已使用以下行配置连接:
dataSource.setRewriteBatchedStatements(true);
我很确定这是两种方法之间的核心区别,但在jdbc池中找不到等效的参数。MySql jdbc驱动程序不支持批处理操作。RewriteBatchedStatement是您能得到的最好的语句。下面是mysql的代码: 这也是我不喜欢MySql,更喜欢Postgres的原因之一 编辑:
您应该结合连接池、批处理操作和RewriteBatchedStatement选项。您可以通过jdbc url参数设置RewriteBatchedStatement选项:
jdbc:mysql://localhost:3307/mydb?rewriteBatchedStatements=true
答案是10倍。我不介意批处理操作是否是“半”纯的,只要它们花费的时间最少,就像我在问题底部演示的那样。我在jdbc池(或任何其他池)中寻找这些“半”纯批处理的等价物。您应该向jdbc url添加参数?rewriteBatchedStatements=true
。
try {
statementBegins();
clearWarnings();
if (!this.batchHasPlainStatements && this.connection.getRewriteBatchedStatements()) {
if (canRewriteAsMultiValueInsertAtSqlLevel()) {
return executeBatchedInserts(batchTimeout);
}
if (this.connection.versionMeetsMinimum(4, 1, 0) && !this.batchHasPlainStatements && this.batchedArgs != null
&& this.batchedArgs.size() > 3 /* cost of option setting rt-wise */) {
return executePreparedBatchAsMultiStatement(batchTimeout);
}
}
return executeBatchSerially(batchTimeout);
} finally {
this.statementExecuting.set(false);
clearBatch();
}