gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:21:35 25 4
gpt4 key购买 nike

我的项目是一个中型的 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)传递参数时,文档状态:

"Arguments will be serialized in JSON internally and hence no functions or prototype chain will be included."

所以看起来 .then() 渲染器中的 getConnection promise 的能力被 JSON 序列化剥夺了。

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

最佳答案

虽然这对“如何实现...”这个问题的回答,但我当然希望并希望我的回答最终不会被接受。我会坚持一段时间,看看你们中的某个聪明人是否想出了更好的东西。

但是实现 promise-mysql 连接池的一种方法是简单地“让步”,不仅让 Electron 的 main.js 实例化连接池,而且让 main.js 运行所有 MySQL 进程 Promise。

在渲染器端,所需要的只是一个 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 序列化的影响;没有要剥离的功能/原型(prototype)。将连接释放回池并将数据发送到请求渲染器很容易并完成了该过程。

所以,事后看来,这个问题实际上与 promise-mysql 的关系不大,更多的是关于为什么 Electron 不能通过 IPC 将功能完整的“丰富”对象传递给渲染器。由此产生的变通实现会导致大量不必要的 IPC 处理。

除非有人以不同的方式看待事物......?

关于mysql - 如何在 Electron 中实现一个 promise-mysql 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43642903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com