nodejs mysql 池连接刚刚空闲

nodejs mysql pool connection just idle

我正在创建一个 nodejs 模块,它从 mysql 数据库中检索一些数据,并在一些数据处理后插入到另一个 mysql 数据库中。我的主要要求是即使第一个数据库中没有数据,也要让模块 24 小时保持活动状态。它只会继续检查任何新数据。但不幸的是,模块在 运行 几分钟后什么也没做。我的函数如下:

var to_pool = mysql.createPool({
    connectionLimit: 100,
    host: 'localhost',
    user: 'username',
    password: 'password',
    database: 'toDatabase',
    multipleStatements: true
});

var from_pool = mysql.createPool({
    connectionLimit: 100,
    host: 'localhost',
    user: 'username',
    password: 'password',
    database: 'fromDatabase'
});

get_data(to_pool, from_pool);

var items_per_query = 100;

function get_data(to_pool, from_pool) {
    from_pool.getConnection(function (err, from_connection) {
        if (err) throw err; // not connected!
    
        //main database query
        from_connection.query("SELECT p.*, d.uniqueid as imei FROM tc_positions p left join tc_devices d on d.id = p.deviceid order by p.id desc limit " + items_per_query, function (err, result, fields) {
            if (err) throw err;

            var items = [];
            if (Object.keys(result).length > 0) {
                Object.keys(result).forEach(function (key) {
                    var x = result[key];
                    items.push({ 'id': x['id'], 'table_name': x['imei'], 'table_columns': table_columns_list });
                });
            }
            if (items.length >= items_per_query) {
                var items_to_be_removed = [];
                let imei_insert = "";
    
                let insert_data = "";
                for (var x = 0; x < items.length; x++) {
                    let all_values = "";
                    let i = 0;
                    for (let v of Object.values(items[x]['table_columns'])) {
                        i++;
                        all_values += "'" + v + "'";
                        if (i < Object.keys(items[x]['table_columns']).length) {
                            all_values += ",";
                        }
                    }
    
                    insert_data += "INSERT INTO " + items[x]['table_name'] + "(dt_server,dt_tracker,lat,lng,altitude,angle,speed,params,fix_time,accuracy,network) VALUES(" + all_values + "); ";
                    items_to_be_removed.push(items[x]['id']);
    
                    if (items_to_be_removed.length == items_per_query) {
                        var final_query = imei_insert + ' ' + createTable + ' ' + insert_data;
  
                        to_pool.getConnection(function (err, platform_connection) {
                            if (err) throw err; 
                            
                            platform_connection.query(final_query, function (err, results, fields) {
                                if (err) throw err;
                                var ids = items_to_be_removed.join(",");
                                
                                from_connection.query("DELETE FROM tc_positions where id IN(" + ids + ")", function (err, results, fields) {
                                    if (err) throw err;
                                    console.log('removed ' + items_to_be_removed.length + ' rows from traccar');
                                    items_to_be_removed = [];
                                    insert_data = "";
                                    from_connection.destroy();
                                    platform_connection.destroy();

                                    // after finish all task call the same function again
                                    return get_data(to_pool, from_pool); 
                                });
                            });
                        });
                    }
                }

            }
            else {
                setInterval(function () { get_data(to_pool, from_pool); }, 10000);
            }
        });
    });
}

get_data() 函数每 10 秒调用一次,但“主数据库查询”部分有时不会执行。有什么方法可以在 get_data() 函数调用时一次又一次地执行数据库查询?

最好使用像 PM2 这样的包管理器并像这样启动你的脚本

pm2 start app.js

无需在代码中设置间隔,让代码 运行 退出,PM2 将在停止时自动重启 运行ning,这将使您的代码按照 24 小时运行您的要求,您还可以设置延迟或设置 restart strategies