Node.js似乎正在收集私有variables,即使他们需要

我有几个模块从数据库中提取数据并将其存储在本地内存中。 然后我有function,从不同的网页需要他们的对象的数据。 它的工作原理很好,除了在暂存服务器上一天一次或两次的对象都是空的,我必须重新启动服务器来重新填充数据。

我已经删除了这里的一些复杂性,但是这是这个想法,几个小时后,道路是空的,getRoad总是返回null;

var db = require('./db.js'); var roads = []; db.query('select * from road', function(err, rows) { if (err) { console.log(err); } roads = rows; }); module.exports.getRoad = function(id) { if (roads[id]) { return roads[id]; } return null; }; 

更新:

我添加db.js,以便您可以看到里面有什么。 我还在每一个日志中都join了大量日志logging,所以下一次失败的时候我会有更多的细节。

 var Pool = require('mysql-simple-pool'); var mysql_pool = new Pool(50, { host: process.env.IP || '127.0.0.1', user: 'username', password: 'password', database: 'database' }); module.exports = mysql_pool; 

更新:

那么,我可能会做出一个单独的问题,但似乎唯一的事情是打破数据库的调用。 所以这绝对不是垃圾收集的问题。 这似乎有一些错误或者与mysql-simple-pool或类似的东西。 如果有人知道为什么mysql-simple-pool会在12个小时后停止响应,我会很感激:)。

从这个简化的代码示例中,我可以看到唯一的场景就是你的db.querycallback函数在几个小时后结束了第二次调用,这将在db.js中指出某种问题。

你有没有检查你的日志console.log(err)输出?

roads的数据不会被垃圾收集,因为如果你调用getRoad ,那么你的模块必须有一个可访问的引用; 如果有一个可以访问的模块本身的引用,你的当地人将无法收集。

另外,还有一些提示:在callback函数中,如果没有错误,则只能采取行动。 换句话说,添加一个else

 db.query('select * from road', function(err, rows) { if (err) { console.log(err); } else roads = rows; }); 

如果你的callback确实是第二次被调用(有错误),这将防止roads被任何东西覆盖。

最后,我强烈build议让getRoadasynchronous。 如果您需要迁移到更具可扩展性的caching解决scheme(例如,redis / memcahed / etc),这将为您提供灵活性。 就像是:

 module.exports.getRoad = function(id, cb) { if (roads[id]) { // this part could later be easily substituted for some cb(null, roads[id]); // other caching mechanism. } else { db.query('select * from road where id=?', [id], function(err, row) { if (err) cb(err); else if (row.length == 0) cb('Not found'); else { roads[id] = row[0]; cb(null, row[0]); } }); } };