首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在电子中实现一个承诺-mysql连接池

问如何在电子中实现一个承诺-mysql连接池
EN

Stack Overflow用户
提问于 2017-04-26 19:25:29
回答 1查看 1.1K关注 0票数 2

我的项目是一个中型的电子应用程序,我使用承诺-mysql到达后端。虽然有关于如何用电子连接到MySQL的几个好例子,但我发现没有一个使用连接池。

我正在使用的数据库服务器是非常小的(a NUC),因此我希望使用一个连接池来限制事情。在我看来,实例化连接池的自然位置应该在电子的main.js文件中,就在应用程序启动窗口之前。这是为了让所有渲染者都能找到它。为了获得和释放连接,我编写了如下ipc处理程序:

代码语言:javascript
复制
// MySQL setup
const ipc = require('electron').ipcMain;
var mysql = require('promise-mysql');
var mysqlParms = require("./mysqlConfig.json");

let cfMySQLPool = mysql.createPool({
  host: mysqlParms.host,
  user: mysqlParms.user,
  password: mysqlParms.password,
  database: mysqlParms.database,
  multipleStatements: true,
  connectionLimit: 4 // NUC is a small box
});

ipc.on('getCFConnection', function (event, arg) {
  event.sender.send('cfConnection', cfMySQLPool.getConnection()); // send a connection Promise
})

ipc.on('releaseCFConnection', function (event, cfConnection) {
  cfMySQLPool.releaseConnection(cfConnection); // release the connection from the pool
})

然而,这是失败的。呈现者没有收到getConnection()的承诺,我想我找到了原因。当event.sender.send (即webcontents.send)传递参数时,docs状态:

“参数将在JSON内部序列化,因此不包含任何函数或原型链。”

因此,.then()的能力--呈现器中的getConnection承诺--似乎被JSON序列化剥夺了。

有没有人可以提供在电子中实现承诺-mysql连接池的解决方案,以便任何呈现器都可以在其上调用getConnection / releaseConnection?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-04-27 06:01:24

虽然这个是对“如何实现.”问题的回答,但我当然希望并希望我的答案不会被接受。我会坚持一段时间,看看你们中的一个智者会不会想出更好的办法。

但是实现承诺的一种方法-- MySQL连接池,就是简单地“让步”,不仅让电子的main.js实例化这个池,而且让main.js运行所有的MySQL进程承诺。

在呈现器方面,只需要一个IPCRenderer请求就可以启动该进程。然后,Main.js通过运行承诺链本身来响应。下面是一个简单的ping:

代码语言:javascript
复制
// process 1: ping MySQL server to see if its up; oParms not used
ipc.on('_mp1', function (event, oParms) {

  let localConn = null;
  cfMySQLPool.getConnection().then((conn) => {
    localConn = conn;
    localConn.ping((err) => {
      cfMySQLPool.releaseConnection(localConn);
      if (err) {
        event.sender.send("mp1_", {error: null, result: false});
      } else {
        event.sender.send("mp1_", {error: null, result: true});
      }
    })
    .catch((err) => {
      event.sender.send("mp1_", {error: err, result: null});
    });
  });

});

来自query()方法的结果(它的返回只是一个结果字段数据数组)不受电子内部JSON序列化的影响;没有函数/原型可以去掉。将连接释放回池并将数据发送到请求呈现程序是很容易的,并且完成了这个过程。

因此,事后看来,这个问题实际上不是关于承诺-mysql真的,而是关于为什么电子不能通过IPC将功能完好无损的“富”对象传递给呈现器。结果的工作实现使许多不必要的IPC处理。

除非有人有不同的看法.?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43642903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档