Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过谷歌应用程序脚本和HTML在谷歌云sql中出现间歇性问题_Html_Google Apps Script_Google Cloud Sql - Fatal编程技术网

通过谷歌应用程序脚本和HTML在谷歌云sql中出现间歇性问题

通过谷歌应用程序脚本和HTML在谷歌云sql中出现间歇性问题,html,google-apps-script,google-cloud-sql,Html,Google Apps Script,Google Cloud Sql,我们的应用程序是按照以下要求开发的 前端:HTML和谷歌应用程序脚本 后端:谷歌云SQL,MySQL版本5.6.21,引擎=InnoDB 我们正在使用存储过程访问云SQL。 此存储过程将通过Google Apps脚本调用 示例存储过程和通过谷歌应用程序脚本执行的过程如下 步骤1:存储过程将创建一个用户,并授予对存储过程、表、触发器、视图的访问权限 DROP PROCEDURE IF EXISTS SP_TEST; CREATE PROCEDURE SP_TEST(OUT SUCCESS_MES

我们的应用程序是按照以下要求开发的

前端:HTML和谷歌应用程序脚本

后端:谷歌云SQL,MySQL版本5.6.21,引擎=InnoDB

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

示例存储过程和通过谷歌应用程序脚本执行的过程如下

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

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步:在谷歌应用程序脚本中使用的调用存储过程/访问sql表的脚本

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个表。 所有存储过程和所有表都将通过root加载到googlecloudsql中,就像用户一样

通过GoogleApps脚本调用存储过程后,用户将在用户表中创建,给定的存储过程将被授予所创建用户的访问权限

但有时,当我们调用任何存储过程/通过GoogleApps脚本访问sql表时,我们会遇到以下问题。最初它运作良好,但最近,只有我们面临这些问题

错误1:“无效连接ID”被抛出,并执行以下操作: 观察到的

  • TESTUSER在mysql.user表中擦除,如下所示

  • 已吊销进程名称1、进程名称2的执行权限

  • 已创建的某些存储过程已被自动删除 已删除,例如PROC_NAME2

  • 无法继续执行剩余的应用程序脚本

错误2:“此连接已关闭”

  • 我们无法继续执行剩余的死刑
在脚本端,如果出现任何问题/异常,我们需要继续执行,也就是说,我们需要删除存储过程执行过程中创建的临时表

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

而且,当我们执行存储过程时,有时会出现如下问题

错误3:“表的密钥文件不正确”。/mysql/procs_priv.MYI';请尝试修复它“

  • 出现此问题后,无法执行或运行任何存储过程/ 访问谷歌云Sql
请参考下面的链接

具有上述发布前和发布后给出的样本存储过程的结果


不推荐使用“jdbc:google:rdbms”连接方式,从外部应用程序连接到云SQL的首选方式是通过“jdbc:mysql”()使用IP连接。

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

作为一般的经验法则,最好实现某种指数退避,以应对偶尔出现的连接错误,例如,由于前面提到的不活动超时、云SQL实例重新启动以及可能的其他不可预见的原因,这种错误可能会不时发生

请阅读公共文档的第[1]节“我应该如何管理连接?”


[1]

请不要大声喊叫。谢谢。