如何使用JDBC和Google-App-Script使连接保持活动以进行多个查询?

时间:2018-09-24 22:33:14

标签: html mysql jdbc google-apps-script google-sheets

我看到了this post,但是它并没有真正帮助我解决问题。

我使用的是HTML对话框,该对话框随Google电子表格上的加载项一起打开,而我使用的是JBDC

我从多个查询中加载MYSQL数据库中的一些数据,我还有一个搜索栏来搜索数据库中的数据,将来我希望我的HTML根据选项自动显示各种数据库值在我的HTML页中选择。基本上,只有一个应用程序会有很多查询,所以我猜应该有一个连接对象可以使用。

我已经尝试了多种方法,可以用伪代码向您展示。

  1. 每次打开一个新连接

这就是我的 GS 文件

function firstFunc()
{
  var conn = Jdbc.getConnection(dbUrl, user, userPwd);
  //do my thing
  return (datas);
}
function secondFunc()
{
  var conn = Jdbc.getConnection(dbUrl, user, userPwd);
  //do my thing
  return (datas);
}
function thirdFunc()
{
  var conn = Jdbc.getConnection(dbUrl, user, userPwd);
  //do my thing
  return (datas);
}

然后是我的HTML

<script>
     var onSuccessFirst = function (data){
      //update my HTML with data
     }
     var onSuccessSecond = function (data){
      //update my HTML with data
     }
     var onSuccessThird = function (data){
      //update my HTML with data
     }
     google.script.run.withSuccessHandler(onSuccessFirst).firstFunc();
     google.script.run.withSuccessHandler(onSuccessSecond).secondFunc();
     google.script.run.withSuccessHandler(onSuccessThird).thirdFunc();
</script>

但是当我使用免费的数据库提供程序来开发第三个连接时,返回一条错误消息,提示我验证密码或用户名,因为它无法连接到数据库。

  1. 尝试将连接从服务器传递到客户端,然后再传递回服务器:

GS文件

function getConnection()
{
  return (Jdbc.getConnection(dbUrl, user, userPwd););
}
function firstFunc(conn)
{
  conn...
  //do my thing
  return (datas);
}
function secondFunc(conn)
{
  conn...
  //do my thing
  return (datas);
}
function thirdFunc(conn)
{
  conn...
  //do my thing
  return (datas);
}

然后是我的HTML

<script>
     var onSuccessFirst = function (data){
      //update my HTML with data
     }
     var onSuccessSecond = function (data){
      //update my HTML with data
     }
     var onSuccessThird = function (data){
      //update my HTML with data
     }
     var onSuccessConnection = function(conn)
     {
       google.script.run.withSuccessHandler(onSuccessFirst).firstFunc(conn);
       google.script.run.withSuccessHandler(onSuccessSecond).secondFunc(conn);
       google.script.run.withSuccessHandler(onSuccessThird).thirdFunc(conn);
     }
     google.script.run.withSuccessHandler(onSuccessConnection).getConnection();
</script>

但是这里connnull

当我的输入(搜索栏)为onchange时,我还会发送很多查询,并且我使用第一种方法有效,但是它不允许快速键入,因为它会增加每个键入字符的连接请求。 / p>

我该怎么办?

2 个答案:

答案 0 :(得分:2)

也许尝试使用第一种方法进行链接:

<script>
 var onSuccessThird = function (data){
  //update my HTML with data
 }
 var onSuccessSecond = function (data){
  //update my HTML with data
 google.script.run.withSuccessHandler(onSuccessThird).thirdFunc();
 }
 var onSuccessFirst = function (data){
  //update my HTML with data
 google.script.run.withSuccessHandler(onSuccessSecond).secondFunc();
 }
 google.script.run.withSuccessHandler(onSuccessFirst).firstFunc();
</script>

注意:

  • google.script.run是一个异步功能。在不等待上一个运行完成的情况下,将一次调用所有三个运行,这意味着在第一种方法中,几乎同时打开了几乎3个Jdbc连接。
  • 单个script.run调用将关闭连接。因此,在第二种方法中,conn将在第一次运行结束之前或之前为null。
      

    当脚本完成执行时,JDBC连接自动关闭。 (请记住,即使进行调用的HTML服务页面保持打开状态,单个google.script.run调用也算是完整的执行。)

参考文献:

答案 1 :(得分:1)

如果您可以使用连接池, 否则,您可以通过检查null并为一次完整的请求响应只打开/关闭一次连接来使一组完整的事务保持连接活动。