通过 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"被抛出,下面是
观察
TESTUSER 在 mysql.user table 中擦除如下
已撤销 PROC_NAME1、PROC_NAME2 的执行权限。
一些已经创建的存储过程被自动
下降如 PROC_NAME2
无法继续执行 Apps 脚本的剩余部分
错误 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"
- 此问题后,无法执行或运行任何存储过程/
访问 Google 云 Sql.
请参考以下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]。
我们的应用程序是根据以下要求开发的
前端: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"被抛出,下面是 观察
TESTUSER 在 mysql.user table 中擦除如下
已撤销 PROC_NAME1、PROC_NAME2 的执行权限。
一些已经创建的存储过程被自动 下降如 PROC_NAME2
无法继续执行 Apps 脚本的剩余部分
错误 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"
- 此问题后,无法执行或运行任何存储过程/ 访问 Google 云 Sql.
请参考以下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]。