Как избежать разрыва соединения с ORACLEDB?Nodejs - PullRequest
1 голос
/ 18 марта 2019

У меня есть соединение с базой данных. Внутри функции, в которой находится комментарий, есть цикл обновления данных для остальных API. Данные обновляются, но при обновлении данных в базе данных Oracle может произойти сбой соединения, и после этого все последующие обновленные данные получат undefined. Как правильно подключиться к базе данных, чтобы не было сбоев?

oracledb.getConnection(
    {
        user: db.user,
        password: db.password,
        connectString: db.connectString
    },
    connExecute
);

function connExecute(err, connection) {
    if (err) {
        console.error(err.message);
        return;
    }
    sql = `SELECT * FROM db.test`;
    connection.execute(sql, {}, { outFormat: oracledb.OBJECT },
        function (err, db) {
            if (err) {
                console.error(err.message);
                connRelease(connection);
                return;
            }
            // data update loop

            connRelease(connection);
        });
}

function connRelease(connection) {
    connection.close(
        function (err) {
            if (err) {
                console.error(err.message);
            }
        });
}

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Вы должны использовать пул соединений.Пулы соединений имеют встроенную логику для обнаружения соединений с проблемами и прозрачного создания новых соединений.См. Эту серию статей о создании REST API для получения более подробной информации: https://jsao.io/2018/03/creating-a-rest-api-with-node-js-and-oracle-database/

Имейте в виду, что проблемы все еще могут возникать, поэтому вы должны обрабатывать ошибки в соответствии с требованиями вашего приложения.

0 голосов
/ 18 марта 2019

В основном вы добавляете прослушиватель на объект соединения, а при разобщении или сбое снова создаете соединение.С небольшими изменениями вы можете принять этот подход и использовать слушателей, чтобы проверить, доступно ли соединение, если не соединиться снова.Может быть несколько причин, по которым закрытие соединения лучше обрабатывает исключения, проверьте, все ли еще подключено, и переподключите в случае ошибки.

Или вы можете попробовать этот NPM, это сделает переподключение для вас https://www.npmjs.com/package/oracledb-autoreconnect

Пинг мне, если вам нужно кальцификации.

var dbConfig = {
    host: '----',
    user: '----',
    password: '----',
    database: '----',
    port: ----
};

var connection;
function handleDisconnect() {
connection = <obj>.getConnection(dbConfig);  
// Recreate the connection, since the old one cannot be reused.
connection.connect( function onConnect(err) {   
// The server is either down
    if (err) {                                  
// or restarting (takes a while sometimes).
        console.log('error when connecting to db:', err);
        setTimeout(handleDisconnect, 10000);
// We introduce a delay before attempting to reconnect,
    }                                           


 // to avoid a hot loop, and to allow our node script to
    });                                        
     // process asynchronous requests in the meantime.

     // If you're also serving http, display a 503 error.
        connection.on('error', function onError(err) {
        console.log('db error', err);
        if (err.code == 'PROTOCOL_CONNECTION_LOST') {
            handleDisconnect();                       
      // lost due to either server restart, or a
        } else {                                  
          // connnection idle timeout (the wait_timeout
            throw err;                          
            // server variable configures this)
            }
        });
    }
    handleDisconnect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...