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
我最近将 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