Java Apache Tomcat JDBC连接池在批处理\批量插入时性能不佳

Java Apache Tomcat JDBC连接池在批处理\批量插入时性能不佳,java,tomcat,jdbc,bulkinsert,jdbc-pool,Java,Tomcat,Jdbc,Bulkinsert,Jdbc Pool,我最近将ApacheTomcatJDBC连接池合并到我的应用程序中(使用MySQL数据库)。我以前尝试过使用ApacheDBCP,但不喜欢它的结果,tomcat实现似乎适合我的需要,即使我运行一个独立的java应用程序,并且根本不使用tomcat 最近,我在执行批处理(又称批量)插入查询时遇到了一个巨大的性能问题 我有一个流程,在这个流程中,我以批处理的方式将大约2500条记录插入到一个表中。使用jdbc连接池时需要花费很长时间,而恢复为每个查询打开连接(无池)时需要几秒钟 我编写了一个小应用程

我最近将ApacheTomcatJDBC连接池合并到我的应用程序中(使用MySQL数据库)。我以前尝试过使用ApacheDBCP,但不喜欢它的结果,tomcat实现似乎适合我的需要,即使我运行一个独立的java应用程序,并且根本不使用tomcat

最近,我在执行批处理(又称批量)插入查询时遇到了一个巨大的性能问题

我有一个流程,在这个流程中,我以批处理的方式将大约2500条记录插入到一个表中。使用jdbc连接池时需要花费很长时间,而恢复为每个查询打开连接(无池)时需要几秒钟

我编写了一个小应用程序,在同一个表中插入30行。池化时需要12秒,不池化时需要约800毫秒

在使用连接池之前,我使用
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();
        }