2015-02-24 45 views
1

我们的应用程序与下列要求开发间歇性问题,Google Apps脚本和HTML

前端:HTML和谷歌Apps脚本

后端:谷歌云SQL,MySQL的VER 5.6.21,引擎= InnoDB

我们使用存储过程来访问CLOUD 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:在谷歌使用脚本Apps脚本调用存储过程/访问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个表格。 所有的存储过程和所有表将被加载到谷歌云Sql通过像用户只。

通过Google apps脚本调用Store Procedure后,将在用户表中创建用户,并为创建的用户授予存储过程的访问权限。

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

错误1: “无效的连接ID” 被关上,下面的事情是 观察

  • TESTUSER在mysql.user表中擦去如下

  • 执行权限撤销的PROC_NAME1,PROC_NAME2。

  • 它已经创建已经自动 下降,如PROC_NAME2一些存储过程

  • 着能够与Google Apps脚本的剩余执行

错误2着手:“此连接IS已关闭“

  • 我们无法继续进行剩余执行..

在脚本方面,如果发生任何问题/异常,我们需要继续执行,即,我们需要删除在STORE PROCEDURE执行过程中创建的临时表。

由于上述问题的发生,我们可以不能够继续进行脚本执行。

而且还当我们执行该存储过程,有时我们越来越像问题

错误3:“为表‘./mysql/procs_priv.MYI’不正确的密钥文件,试图修复它”

  • 此问题之后,无法执行或运行任何存储过程/ 访问Google云Sql。

请参照下面的链接..

具有被上述前发行和发行后给定的样本存储过程的结果......

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

+1

请勿SHOUT。谢谢。 – jbutler483 2015-02-24 12:55:09

回答

0

的“JDBC:谷歌:RDBMS'连接的方式被弃用,以从外部应用程序连接到云SQL的首选方法是通过使用IP连通性‘JDBC:MySQL的’(docs)。

0

这看起来像常见的连接超时由于实例活动(即云SQL有两种计费方案和大多数用户选择,这意味着该实例并不总是启动和运行每次使用计划remeber)。

作为一般的经验法则,实施某种类型的指数回退总是可取的,以应对偶尔的连接错误,例如由于已经提到的不活动超时而可能不时发生的Cloud SQL实例重新启动,并可能还有其他不可预知的原因。

请参阅“我应如何管理连接?”公共文件第[1]节。

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