通过谷歌应用程序脚本和HTML在谷歌云sql中出现间歇性问题
我们的应用程序是按照以下要求开发的 前端:HTML和谷歌应用程序脚本 后端:谷歌云SQL,MySQL版本5.6.21,引擎=InnoDB 我们正在使用存储过程访问云SQL。 此存储过程将通过Google Apps脚本调用 示例存储过程和通过谷歌应用程序脚本执行的过程如下 步骤1:存储过程将创建一个用户,并授予对存储过程、表、触发器、视图的访问权限通过谷歌应用程序脚本和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
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
- 无法继续执行剩余的应用程序脚本
- 我们无法继续执行剩余的死刑
- 出现此问题后,无法执行或运行任何存储过程/ 访问谷歌云Sql
不推荐使用“jdbc:google:rdbms”连接方式,从外部应用程序连接到云SQL的首选方式是通过“jdbc:mysql”()使用IP连接。这看起来像是由于实例不活动而导致的常见连接超时(请记住,云SQL有两个计费计划,大多数用户选择每次使用计划,这意味着实例并不总是启动和运行) 作为一般的经验法则,最好实现某种指数退避,以应对偶尔出现的连接错误,例如,由于前面提到的不活动超时、云SQL实例重新启动以及可能的其他不可预见的原因,这种错误可能会不时发生 请阅读公共文档的第[1]节“我应该如何管理连接?”
[1] 请不要大声喊叫。谢谢。