通过 Google 应用程序脚本和 HTML Google 云 sql 中的间歇性问题

Intermittent issue in Google cloud sql via Google apps script and HTML

我们的应用程序是根据以下要求开发的

前端:HTML 和 Google 应用程序脚本

后端:Google Cloud SQL,MySQL VER 5.6.21, engine= InnoDB

我们正在使用存储过程访问云 SQL。 此存储过程将通过 Google Apps 脚本调用。

示例存储过程和通过 Google Apps 脚本执行的过程如下...

第 1 步:存储过程将创建一个用户并为存储过程授予访问权限,tables、触发器、视图

DROP PROCEDURE IF EXISTS SP_TEST;
CREATE PROCEDURE  SP_TEST(OUT SUCCESS_MESSAGE TEXT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN 
ROLLBACK;    
SET SUCCESS_MESSAGE=0;
END;
START TRANSACTION;
SET AUTOCOMMIT = 0;
DROP USER TESTUSER;
CREATE USER 'TESTUSER'@'%' IDENTIFIED BY 'TESTUSER';
GRANT EXECUTE ON PROCEDURE PROC_NAME1 TO 'TESTUSER'@'%';
GRANT EXECUTE ON PROCEDURE PROC_NAME2 TO 'TESTUSER'@'%';
SET SUCCESS_MESSAGE=1;
COMMIT;
END;

第 2 步:Google 应用程序脚本中使用的脚本调用商店 procedure/access sql table

try
{
//OPEN CONNECTION
var conn=Jdbc.getCloudSqlConnection("jdbc:google:rdbms://" + DB_INSTANCE + "/" + DB_SCHEMA, DB_USER, DB_PASSWORD);
conn.setAutoCommit(false);

//CALL STORE PROCEDURE
var create_stmt = conn.createStatement();
create_stmt.execute("CALL SP_TEST (@SUCCESS_MESSAGE)”);
create_stmt.close();

//SELECT RESULT RETURNED FROM STORE PROCEDURE
var stmt_rolecrinsrtflag = conn.createStatement()
var flag_rolecrinsrtselect="SELECT @SUCCESS_MESSAGE";
var flag_rolecrinsrtrs=stmt_rolecrinsrtflag.executeQuery(flag_rolecrinsrtselect);
if(flag_rolecrinsrtrs.next())
var flag_rolecrinsrtinsert=flag_rolecrinsrtrs.getString("@SUCCESS_MESSAGE");
flag_rolecrinsrtrs.close();
stmt_rolecrinsrtflag.close();
conn.commit();

//CLOSE CONNECTION
conn.close();
return flag_rolecrinsrtinsert;
}
catch(err)
{
//to do rollback,if any exception..
conn.rollback(); 
}

我们有 200 多个 sp 和 98 个 tables。 所有存储过程和所有 tables 将通过 root 加载到 Google Cloud Sql 中,例如仅限用户。

通过 Google 应用程序脚本调用存储过程后,将在用户 table 中创建用户,并且给定的存储过程将被授予对创建的用户的访问权限。

但有时我们在调用任何存储过程/通过 Google Apps 脚本访问 sql table 时会遇到以下问题。刚开始用的还不错,但是最近,只有我们遇到了这些问题。

错误1:"INVALID CONNECTION ID"被抛出,下面是 观察

错误 2:"THIS CONNECTION IS CLOSED"

在脚本端如果有任何issue/exception发生,我们需要继续执行,即我们需要删除在STORE PROCEDURE执行过程中创建的temp table。

由于出现上述问题,我们无法继续执行脚本。

而且当我们执行存储过程时,有时我们会遇到类似

的问题

错误 3:"Incorrect key file for table './mysql/procs_priv.MYI'; try to repair it"

请参考以下link..

具有上面给出的示例存储过程的结果-发布前和发布后...

https://docs.google.com/a/ssomens.com/document/d/1N5_-O2UfescCmWe9IorteUZUh7gtgkF9-RwubvF4MhM/edit

'jdbc:google:rdbms' 连接方式已弃用,从外部应用程序连接到云 SQL 的首选方式是通过 'jdbc:mysql' 使用 IP 连接(docs).

这看起来像是由于实例不活动导致的常见连接超时(请记住,云 SQL 有两个计费计划,大多数用户选择按使用计费计划,这意味着实例并不总是运行并且 运行).

作为一般的经验法则,始终建议实施某种指数退避以应对像这样的偶然连接错误,由于已经提到的不活动超时,这种情况可能会不时发生,Cloud SQL 实例重启,可能还有其他不可预见的原因。

请阅读 public 文档的 "How should I manage connections?" 部分 [1]。

[1] https://cloud.google.com/sql/faq#connections