nodejs mysql соединение пула просто простаивает - PullRequest
0 голосов
/ 14 июля 2020

Я создаю модуль 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 ()?

1 Ответ

0 голосов
/ 14 июля 2020

лучше использовать диспетчер пакетов, например PM2 , и запускать ваш скрипт следующим образом

pm2 start app.js

нет необходимости устанавливать интервалы в вашем коде, позвольте коду работать и выходить, PM2 перезапустит его автоматически, когда он перестанет работать, это сделает ваш код живым 24 часа в соответствии с вашими требованиями, вы также можете настроить задержки или настроить стратегии перезапуска

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...