jdbc在将数据从googlesheets发送到mysql时“超过了锁等待超时”

ctehm74n  于 2021-06-23  发布在  Mysql
关注(0)|答案(0)|浏览(207)

我编写了一个apps脚本宏,将数据从google电子表格发送到mysql表。第一次,在中删除表中的一些行,然后在此表中添加行。我有时会得到一个“锁等待超时超过;尝试重新启动事务”错误。有时是100秒,有时是4分钟。
我不明白这个代码怎么了。

//classeur.insertSheet("feuillebis")
//feuillebis=classeur.getSheets()[1]
//var feuillebis=classeur.getSheetByName('feuillebis')
var classeur = SpreadsheetApp.getActiveSpreadsheet() ;
var feuille = classeur.getActiveSheet();
var host = "107.167.186.180";
var databaseName = "eatology";
var userName = "root";
var password = "eatology";
var port = 3306;
var tableName = "weekly_order";

var url = 'jdbc:mysql://' + host + ':' + port + '/' + databaseName;
var nbrow = feuille.getMaxRows()

function Send_Weekly_Order_To_Data_Base() {
  ///here are all the connection parameters
  var classeur = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = classeur.getActiveSheet();
  var nbrow = feuille.getMaxRows();
  var host = "107.167.186.180";
  var databaseName = "eatology";
  var userName = "root";
  var password = "eatology";
  var port = 3306;
  var tableName = "weekly_order";
  var url = 'jdbc:mysql://' + host + ':' + port + '/' + databaseName;
  var conn = Jdbc.getConnection(url, userName, password); 
  conn.setAutoCommit(false);

  ///get the weekly_order as an array from the sql
  var rowcount = 0;
  var stmt2 = conn.createStatement();
  var results = stmt2.executeQuery("SELECT * FROM eatology.weekly_order");
  while (results.next()) {
    if (results.getInt(1) > rowcount){
      rowcount = results.getInt(1)
    }
  }
  conn.commit();
  results.close();
  stmt2.close();

  ///delete the rows from the current week where we are running the macro
  var timezone1 = classeur.getSpreadsheetTimeZone();
  var date1 = Utilities.formatDate(feuille.getRange(2, 2).getValue(), timezone1, "yyyy-MM-dd");
  var date2 = Utilities.formatDate(feuille.getRange(2, 3).getValue(), timezone1, "yyyy-MM-dd");
  var date3 = Utilities.formatDate(feuille.getRange(2, 4).getValue(), timezone1, "yyyy-MM-dd");
  var date4 = Utilities.formatDate(feuille.getRange(2, 5).getValue(), timezone1, "yyyy-MM-dd");
  var date5 = Utilities.formatDate(feuille.getRange(2, 6).getValue(), timezone1, "yyyy-MM-dd");
  var date6 = Utilities.formatDate(feuille.getRange(2, 7).getValue(), timezone1, "yyyy-MM-dd");

  ///clear the table weekly-order in the database
  var stmt1 = conn.createStatement();
  var result = stmt1.executeUpdate("DELETE FROM eatology.weekly_order where `Date` = "  + "'" + date1 + "'" +" or `Date` = " + "'" + date2 + "'" +" or `Date` = " + "'" + date3 + "'" +" or `Date` = "+  "'" + date4 + "'" +" or `Date` = " + "'" + date5 + "'" +" or `Date` = "+ "'" + date6 + "'" );
  //var result = stmt1.executeUpdate("DELETE FROM eatology.weekly_order where `Date` = "  + "'" + date1 +"'");

  conn.commit();
  stmt1.close();
  conn.close();

  rowcount = rowcount + 1;

  var conn = Jdbc.getConnection(url, userName, password); 
  conn.setAutoCommit(false);
  var stmt = conn.prepareStatement('INSERT INTO eatology.weekly_order '
      + '(`Uid`, `Date`, `MP`, `Cname`, `Pname`, `Breakfast`, `Snack1`, `Lunch`, `Snack2`, `Dinner`) values (?,?,?,?,?,?,?,?,?,?)');

  var program_name_line = 0;
  var array = feuille.getRange(1, 1, nbrow, 7).getValues();
  for (var j = 1; j < 7; j = j + 1) {
    var inside = 0;
    var i = 1;
    while (array[i][0] != "Total" && i < 1000) {
      i = i + 1
      var color = feuille.getRange(i + 1, j + 1).getBackgrounds()
      var fi1 = array[i][0].toString();
      var fij = array[i][j].toString();
      var empty = (fij == "");
      var already = 0;
      var test11111 = (color != "#5d31ce");

      var cas1 = ((empty == false) && (fi1 != "Total") && (inside == 0));
      var cas2 = (color == "#5d31ce" && inside == 1);
      var cas3 = (empty == false);

      if ((fi1 != "Total") && (inside == 0) && color != "#5d31ce") {
        program_name_line = i;
        inside = 1; 

        if (empty == false) {
          var Uid = rowcount;
          var Date1 = (Utilities.formatDate(array[1][j], timezone1, "yyyy-MM-dd"));   
          var MP = (array[program_name_line][0]);
          var place = ((fij).indexOf("-"));
          var length = (fij.length);
          var Pname = ((fij).substring(place + 1, length));
          var Cname = ((fij).substring(0, place));
          var list = (meal(MP, Pname));
          var Breakfast = list[0];
          var Snack1 = list[1];
          var Lunch = list[2];
          var Snack2 = list[3];
          var Dinner = list[4];
          if (MP == "TM") {
            var Breakfast = 1;
            var Snack1 = 1;
            var Lunch = 1;
            var Snack2 = 1;
            var Dinner = 1;
          }
          rowcount = rowcount + 1;
          stmt.setInt(1, Uid);
          stmt.setString(2, Date1);
          stmt.setString(3, MP);
          stmt.setString(4, Cname);
          stmt.setString(5, Pname);
          stmt.setInt(6, Breakfast);
          stmt.setInt(7, Snack1);
          stmt.setInt(8, Lunch);
          stmt.setInt(9, Snack2);
          stmt.setInt(10, Dinner);
          stmt.addBatch();
        }
      }
      else if (color == "#5d31ce" && inside == 1) {
        inside = 0;
      }
      else if (empty == false && color != "#5d31ce") {
        var Uid = rowcount ;
        var Date1 = (Utilities.formatDate(array[1][j], timezone1, "yyyy-MM-dd"));
        var MP =  (array[program_name_line][0].toString());
        var place = ((fij).indexOf("-"));
        var length =  (fij.length);
        var Pname = ((fij).substring(place + 1, length));
        var Cname = ((fij).substring(0, place));
        var list = (meal(MP, Pname));
        var Breakfast = (list[0]);
        var Snack1 = (list[1]);
        var Lunch = (list[2]);
        var Snack2 = (list[3]);
        var Dinner = (list[4]);

        if (MP == "TM") {
          var Breakfast = 1;
          var Snack1 = 1;
          var Lunch = 1;
          var Snack2 = 1;
          var Dinner = 1;
        }

        rowcount = rowcount+1;
        stmt.setInt(1, Uid);
        stmt.setString(2, Date1);
        stmt.setString(3, MP);
        stmt.setString(4, Cname);
        stmt.setString(5, Pname);
        stmt.setInt(6, Breakfast);
        stmt.setInt(7, Snack1);
        stmt.setInt(8, Lunch);
        stmt.setInt(9, Snack2);
        stmt.setInt(10, Dinner);
        stmt.addBatch(); 
      }
    }
  }

  stmt.executeBatch();
  conn.commit();
  stmt.close();
  conn.close();
}

function meal(MP, Pname){
  var result= [0, 0, 0, 0, 0]
  //in order to know if we have two snacks or only one because if the programm has more than 1200 cal, there are two snacks, otherwise, only one snack
  var two_snacks = 1
  if (MP.indexOf("1200") > -1) {
    two_snacks = 0
  }
  //if the program type is '3'
  if (Pname.indexOf("3") > -1) {
    result[0] = 1;
    result[1] = 1;
    result[2] = 1;
    result[4] = 1;
    if (two_snacks == 1) {
      result[3] = 1;
    }
  }
  //if the program type is '2'
  if (Pname.indexOf("2") > -1 && Pname.indexOf("S") == -1) {
    result[0] = 1;
    result[1] = 1;
    result[2] = 1;
    if (two_snacks == 1) {
      result[3] = 1;
    }
  }
  //if there is the B letter
  if (Pname.indexOf("B") > -1) {
    result[0] = 1;
  }
  //if there is the L letter
  if (Pname.indexOf("L") > -1) {
    result[2] = 1;
  }
  //if there is the D letter
  if (Pname.indexOf("D") > -1) {
    result[4] = 1;
  }
  //if there is the 2S letter
  if (Pname.indexOf("2S") > -1) {
    result[1] = 1;
    result[3] = 1;
  }
  //if there is the 1S letter
  if (Pname.indexOf("1S") > -1) {
    result[1] = 1;
    result[1] = 1;
  }
  return result
}

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题