如何在Electron中实现promise-mysql连接池

时间:2017-04-26 19:25:29

标签: mysql node.js electron

我的项目是一款中型电子应用,我使用promise-mysql来达到后端。虽然several good examples涵盖了如何在Electron中连接MySQL,但我发现没有人使用连接池。

我使用的数据库服务器非常小(a NUC),因此我希望使用一个连接池来控制事物。在我看来,实例化连接池的自然场所将在应用程序启动窗口之前的Electron的main.js文件中。这样所有渲染器都可以实现。为了获取和释放连接,我写了这样的ipc处理程序:

// 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()接收Promise,我想我发现了原因。当event.sender.send(webcontents.send)传递参数时,文档说明:

  

“参数将在内部以JSON序列化,因此没有   将包括函数或原型链。“

因此看起来.then()渲染器中getConnection承诺的能力被JSON序列化剥夺了。

有没有人在Electron中实现promise-mysql连接池提供任何解决方案,以便任何渲染器都可以调用getConnection / releaseConnection?谢谢。

1 个答案:

答案 0 :(得分:0)

虽然 IS 回答了问题"如何实施......",我当然希望并希望我的答案不会成为接受了一个。我会坚持一段时间,看看你们中的一个人是否想出更好的东西。

但是实现promise-mysql连接池的一种方法是简单地“放弃”#34;并且不仅Electron的main.js实例化了池,而且main.js也运行你所有的MySQL进程Promises。

在渲染器方面,所需要的只是IPCRenderer启动流程的请求。然后Main.js通过运行Promise链本身来响应。这是一个简单的ping:

// 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() method的结果,其返回只是结果字段数据的数组,不会受到Electron的内部JSON序列化的影响;剥离没有功能/原型。将连接释放回池并将数据发送到请求的渲染器很容易,并完成整个过程。

所以,事后看来,这个问题实际上更少关于promise-mysql,更多的是为什么Electron无法通过" rich"具有完整功能的对象通过IPC提供给渲染器。由此产生的解决方案实现了大量不必要的IPC处理。

除非有人看到不同的东西......?