Apache Tomcat JDBC 批量插入连接池性能不佳

Apache Tomcat JDBC Connection Pool bad performance on batch \ bulk inserts

我最近将 Apache Tomcat JDBC 连接池合并到我的应用程序中(使用 MySQL 数据库)。我以前尝试过使用 Apache DBCP,但不喜欢它的结果,并且 tomcat 实现似乎满足我的需求,即使我 运行 是一个独立的 java 应用程序并且不使用 tomcat 完全没有。

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

我有一个流程,其中我以批量方式将 ~2500 条记录插入 table。使用 jdbc 连接池需要很长时间,而恢复为每个查询打开连接(无池)需要几秒钟。

我写了一个小应用程序,它向同一个 table 插入 30 行。合并时需要 12 秒,不合并时需要 800 毫秒。

在使用连接池之前,我使用 com.mysql.jdbc.jdbc2.optional.MysqlDataSource 作为我的数据源。使用以下行配置连接:

dataSource.setRewriteBatchedStatements(true);

我很确定这是两种方法之间的核心区别,但在 jdbc-pool 中找不到等效参数。

MySql JDBC驱动不支持批量操作。 RewriteBatchedStatement 是您可以获得的最好的。这里的代码来自 mysql PreparedStatement.java:

 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();
        }

这是我不喜欢 MySql 而更喜欢 Postgres

的原因之一

编辑:

您应该结合连接池、批处理操作和 RewriteBatchedStatement 选项。您可以通过 jdbc url 参数设置 RewriteBatchedStatement 选项:jdbc:mysql://localhost:3307/mydb?rewriteBatchedStatements=true