使用 JDBC executeBatch() 通过 appscript 批量插入 Cloud SQL,耗时过多

Posted

技术标签:

【中文标题】使用 JDBC executeBatch() 通过 appscript 批量插入 Cloud SQL,耗时过多【英文标题】:Bulk insert to Cloud SQL by appscript using JDBC executeBatch() consuming too much time 【发布时间】:2019-08-12 03:01:46 【问题描述】:

我收集了一些原始数据并将其存储在谷歌电子表格中,还有一个现有的谷歌云 SQL 实例。我正在尝试使用 appscript 从 gsheet 中提取数据,然后推送到 gcloud SQL。

不幸的是,我发现完成“批量插入”花费了太多时间。这是我的方法和结果(在这个例子中,我没有展示从 gsheet 中提取数据的方法,因为它快速且无关紧要):

应用脚本:

   var connection = [My Connection];
   connection.setAutoCommit(false);
   var stmt = connection.prepareStatement('INSERT INTO [testTable]'
      + '(emp_no,title,from_date,to_date) values (?, ?, ?, ?)');
   for (var i = 1; i <= 50; i++)  //tuples counter i
    stmt.setString(1, 1);
    stmt.setString(2, "Worker" + i);
    stmt.setString(3, "2018-03-11");
    stmt.setString(4, "2019-05-04");
    stmt.addBatch();
  
  stmt.executeBatch();
  connection.commit();

简单的代码,这是我的结果(来自“执行记录”):

当元组计数器i小于等于50时:

[19-08-12 13:57:46:470 NZST] JdbcPreparedStatement.executeBatch() [9.978 秒]

当元组计数器i小于等于500时:

[19-08-12 14:10:23:575 NZST] JdbcPreparedStatement.executeBatch() [96.578 秒]

我想做的是拉和推 5000 个元组。在这种情况下如何减少执行时间?

【问题讨论】:

这听起来不像是“批处理”。向我们展示生成的 SQL。 【参考方案1】:

Google Apps 脚本的 JDBC 连接器速度非常慢。

您可能不得不完全放弃使用它,而改用其他东西。

如果您熟悉 Node.js,那么您可能需要考虑使用 Cloud Function 作为中介服务,将数据推送到工作表和 CloudSQL 数据库或从中提取数据。

【讨论】:

谢谢,会做的

以上是关于使用 JDBC executeBatch() 通过 appscript 批量插入 Cloud SQL,耗时过多的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Netezza 上执行 executeBatch() - JDBC

JDBC批量插入数据优化,使用addBatch和executeBatch

JDBC批量插入数据优化,使用addBatch和executeBatch

JDBC批量插入数据优化,使用addBatch和executeBatch

聊聊 JDBC 的 executeBatch || 对比下不同数据库对 JDBC batch 的实现细节

如何使用 SimpleJdbcInsert 和 executeBatch 和 MYSQL JDBC 驱动程序获取生成的密钥?