node.js - 每 15 秒查询一次 DB2 导致 NodeJS 中的内存泄漏
问题描述
我有一个应用程序,它使用 IBM 的idb-connector在 iSeries 上每 15 秒检查一次 DB2 中的新条目。我有异步函数,它将查询结果返回给 socket.io,socket.io 会发出一个事件,其中包含前端的数据。我已经缩小了异步函数的内存泄漏。我已经阅读了多篇关于常见内存泄漏原因以及如何诊断它们的文章。
Marmelab:查找和修复 Node.js 内存泄漏:实用指南
但我仍然没有看到问题出在哪里。此外,我无法获得在系统上安装 node-gyp 的权限,这意味着大多数内存管理工具都无法使用,因为 memwatch、heapdump 等需要安装 node-gyp。这是函数基本结构的示例。
const { dbconn, dbstmt } = require('idb-connector');// require idb-connector
async function queryDB() {
const sSql = `SELECT * FROM LIBNAME.TABLE LIMIT 500`;
// create new promise
let promise = new Promise ( function(resolve, reject) {
// create new connection
const connection = new dbconn();
connection.conn("*LOCAL");
const statement = new dbstmt(connection);
statement.exec(sSql, (rows, err) => {
if (err) {
throw err;
}
let ticks = rows;
statement.close();
connection.disconn();
connection.close();
resolve(ticks.length);// resolve promise with varying data
})
});
let result = await promise;// await promise
return result;
};
async function getNewData() {
const data = await queryDB();// get new data
io.emit('newData', data)// push to front end
setTimeout(getNewData, 2000);// check again in 2 seconds
};
关于泄漏在哪里的任何想法?我是否错误地使用了异步/等待?或者我是否不正确地创建/销毁数据库连接?任何有关找出此代码泄漏原因的帮助将不胜感激!
编辑:忘了提到我对后端进程的控制有限,因为它们是由另一个团队处理的。我只是检索他们填充数据库的数据并将其添加到网页中。
编辑 2:我想我已经把它缩小到数据库连接没有被正确清理。但是,据我所知,我已经按照他们的github repo上建议的说明进行操作。
解决方案
我不知道您的具体问题的答案,但不是每 15 秒发出一次查询,我可能会以不同的方式解决这个问题。原因是当环境可以告诉我发生了事件时,我通常不喜欢钓鱼探险。
因此,在这种情况下,您可能想尝试一个数据库触发器,在添加时将行的键加载到数据队列中,甚至在必要时更改或删除。然后,您可以进行异步调用以等待数据队列中的记录。这是更实时的,并且事件处理程序仅在记录出现时才被调用。处理程序可以从数据库中获取特定记录,因为您知道它是关键。数据队列比数据库 IO 快得多,并且对触发器的开销很小。
我看到了这种方法的几个潜在优势:
- 您不会发出数十个可能返回数据也可能不返回数据的查询。
- 该事件将在记录添加到表中的那一刻触发,而不是 15 秒后触发。
- 您不必为一个或多个新记录的可能性编写代码,它始终为 1,即数据队列中提到的那个。
推荐阅读
- javascript - Android 应用上的 Cordova 音量按钮功能
- azure-devops - 我们可以在 VSTS 上有团队明智的燃尽图和看板吗?
- node.js - Nodejs mongoose 在一个查询中从两个集合中获取结果
- sql - 在多个子查询中使用同一个表时是否需要表别名
- python - Python时间戳数据框仅数字/十进制过滤
- java - 将 PDFBox 迁移到 2.x 时出现 GetPages 错误
- git - 怎么说 HEAD~20 如果存在,否则先提交
- python - windows 10 pip install '连接失败'
- c# - 称为Type.InvokeMember 不起作用。如何获得资源的价值?
- docker - 在 docker 容器中运行 AngularDart - 内存使用