使用crontab时Mongodb被锁定

时间:2018-09-23 15:04:15

标签: node.js mongodb mongoose cron

我正在创建一个应用程序,该应用程序从API中提取数据,并使用crontab将其保存到MongoDB中。

这是我的crontab文件的示例:

*/2 * * * * /home/`whoami`/TLC/dataProvider1.js
*/1 * * * * /home/`whoami`/TLC/dataProvider2.js
*/3 * * * * /home/`whoami`/TLC/dataProvider3.js

这些脚本是我已使其可执行的JS文件,它们均具有一个require语句,用于具有数据库连接的单独文件,因此它们每个都连接到数据库,以便可以保存提取的数据。 数据库连接文件:

var mongoose = require('mongoose');

var connect = function () {
    mongoose.connect('mongodb://localhost:27017/vario', {
        socketTimeoutMS: 0,
        keepAlive: true,
        reconnectTries: 30,
        useNewUrlParser: true,
        autoReconnect: true,
        keepAliveInitialDelay: 300000
    });
};
connect();

mongoose.connection.on('connected', function () {
    console.log('Connection established to the Database...');
});

mongoose.connection.on('error', function (err) {
    console.log('Could not connect to Database.\nError: ' + err);
});

process.on('SIGINT', function () {
    mongoose.connection.close(function () {
        console.log('Force to close the MongoDB conection');
        process.exit(0);
    });
});

module.exports = connect;

问题::当这些作业运行约一个小时时,MongoDB会以某种方式被锁定,无法保存更多数据。触发mongo shell会产生一个错误,表明连接已被拒绝。使用mongod进行恢复还会产生一个错误,即数据文件(/ data / db /)上的另一个实例已在运行,因此它无法锁定mongod.lock文件。我现在处理此问题的唯一方法是关闭并重新启动守护进程。我该如何处理?

注意:我之所以使用crontab是因为setInterval会干扰应用程序的浏览,以防应用程序保存到数据库中。

1 个答案:

答案 0 :(得分:0)

经过仔细检查,我意识到我的crontab作业正在创建到DB的新连接,这些连接从未关闭。我要做的只是确保脚本完成运行后关闭连接。