Mysql 谷歌应用程序脚本上的JDBC。异常:由于超时或客户端请求,语句被取消

Mysql 谷歌应用程序脚本上的JDBC。异常:由于超时或客户端请求,语句被取消,mysql,google-apps-script,jdbc,mysql-workbench,Mysql,Google Apps Script,Jdbc,Mysql Workbench,我正试图从谷歌应用程序脚本中使用JDBC从谷歌云SQL上的mySQL数据库中获取数据。然而,我得到了这个错误: 异常:由于超时或客户端请求,语句被取消 我可以成功地获取一些其他数据。然而,有些数据我不能 我在mySQL工作台上执行一个成功的查询和一个不成功的查询。我可以在mySQL workbench上毫无问题地执行不成功的查询 我比较了持续时间 Duration / Fetch ------------------------------------------- Successful que

我正试图从谷歌应用程序脚本中使用JDBC从谷歌云SQL上的mySQL数据库中获取数据。然而,我得到了这个错误:

异常:由于超时或客户端请求,语句被取消

我可以成功地获取一些其他数据。然而,有些数据我不能

我在mySQL工作台上执行一个成功的查询和一个不成功的查询。我可以在mySQL workbench上毫无问题地执行不成功的查询

我比较了持续时间

Duration / Fetch
-------------------------------------------
Successful query:     0.140 sec / 0.016 sec
Unsuccessful query:   0.406 sec / 0.047 sec
不成功的查询似乎需要更长的时间。因此,我使用以下参数设置查询超时:

stmt.setQueryTimeout(0);
打算不设置超时(当该值设置为零时,表示执行没有超时限制)。然后,我在谷歌应用程序脚本上执行了它


但是,它不起作用,并得到相同的错误。你能告诉我解决方法吗?

这似乎是一个已知的问题。明星★ 并对这一问题发表评论,以便让谷歌开发人员优先考虑这一问题。在问题解决之前,您可以。

问题与上面提到的相同,今天失败,因此我尝试更改旧版本,它对我有效。FYI更新以添加第二个修复程序

经过一些尝试和错误之后,我发现是什么为我解决了这个问题——一些查询成功了,另一些返回了这个错误

修复1 共同点是,V8 engine/new editor将查询转换为多行格式后出现了此问题

例如,切换到新编辑器/V8转换的长文本字符串类似于以下内容:

var query = "select Street_Number, street_name, street_suffix, street_dir_prefix, postal_code, city, mls, address, unitnumber " 
  +"as unit, uspsid,latitude,longitude from properties.forsale where status = 'active' and zpid is null and property_type = 'residential'"
var query = "select Street_Number, street_name, street_suffix, street_dir_prefix, postal_code, city, mls, address, unitnumber as unit, uspsid,latitude,longitude from properties.forsale where status = 'active' and zpid is null and property_type = 'residential'"
此查询导致如上所述的错误。修复程序正在将较长的查询更改为连续字符串,如下所示:

var query = "select Street_Number, street_name, street_suffix, street_dir_prefix, postal_code, city, mls, address, unitnumber " 
  +"as unit, uspsid,latitude,longitude from properties.forsale where status = 'active' and zpid is null and property_type = 'residential'"
var query = "select Street_Number, street_name, street_suffix, street_dir_prefix, postal_code, city, mls, address, unitnumber as unit, uspsid,latitude,longitude from properties.forsale where status = 'active' and zpid is null and property_type = 'residential'"
修复2

这一次更令人沮丧。当涉及到数据库连接时,V8并不是那么宽容。在V8之前,它会自动关闭任何延迟的连接,但是,看起来V8不喜欢这样。我最初编写脚本的目的是共享尽可能少的连接,但我注意到有一些脚本出现了此错误,而正是在这些脚本中,连接可能被“拆分”。例如:

var conn = getconnection() //this is a connection function I have written
  var date = date || Utilities.formatDate(new Date(), "America/Chicago", "yyyy-MM-dd");

  var keyobj = getkeys(undefined,undefined,conn);
  conn = keyobj.conn;
  var results = sqltojson(query, true, conn);
上面的函数导致了这个错误,我假设这是因为“conn”变量是从函数返回的,但是,我要做一个大胆的假设,无论出于何种原因,连接不能同时在两个单独的函数中,因为它被返回并继续作为对象“keyobj”和“conn”中的值。定义
conn
变量后立即添加
delete keyobj.conn
,实现了以下目的:

var conn = getconnection() //this is a connection function I have written
  var date = date || Utilities.formatDate(new Date(), "America/Chicago", "yyyy-MM-dd");

  var keyobj = getkeys(undefined,undefined,conn);
  conn = keyobj.conn;
  delete keyobj.conn;
  var results = sqltojson(query, true, conn);

执行这两个修复程序可停止此错误,并允许脚本继续运行,不会出现任何问题。

感谢您提供的信息。我盯着这个问题看。对于解决方案,我切换回了遗留运行时。这对OPs答案没有帮助。我希望修复2能够工作,但在我的案例中我无法找到它。我使用的是单行SQL查询,我使用的是“conn=Jdbc.getCloudSqlConnection(url,info)”。。。没有拆分行,也没有辅助函数,我仍然得到错误“Exception:语句由于超时或客户端请求而取消”@Womprat我实际上隔离了JDBC服务和V8的一些其他问题。我实现的一个解决方案有助于避免此错误的随机发生,即在循环中调用
.execute()
方法,当遇到此错误时,它将关闭连接并启动新连接,然后再次尝试。我将循环设置为尝试5次,然后在第5次抛出错误。最后,JDBC服务中似乎存在的一个问题是它如何解释子查询——根本不喜欢很多嵌套子查询。@Womprat我还将再次修改我的答案,因为我将函数从传递函数间的连接改为传递从函数创建的语句——V8这比通过许多函数发送连接本身要好。