Как мне обработать пул node.js mssql, случайно закрытый? - PullRequest
0 голосов
/ 29 января 2019

Я создаю приложение, использующее node-mssql для подключения к серверу sql, и пытаюсь использовать пул соединений для всего приложения для повышения производительности.Я создал одноэлементный класс для этого

export class MSSQLHelper {
    connectionPool = null;
    helperInstance = null;
    constructor() {
        this.connectionPool = null;
    }

    static getMSSQLHelperInstance(){
        if(!this.helperInstance) {
            this.helperInstance = new MSSQLHelper();
        }
        return this.helperInstance;
    }

    getConnectionPool() {
        let deferred = Q.defer();
        let { reject, resolve, promise } = deferred;
        if(this.connectionPool) {
            if(this.connectionPool._connected && !this.connectionPool._connecting) {
                resolve(this.connectionPool);
            }
            else {
                this.connectionPool.connect(err => {
                    if(err) {
                        reject(err);
                    }
                    else{
                        resolve(this.connectionPool);
                    }
                })
            }
        }
        else {
            logger.debug("start of creating connection pool");
            let pool = new sql.ConnectionPool(dbSetting, err => {
                logger.debug("end of creating conneciton pool");
                if (err) {
                    reject(err);
                    if(close in pool){
                        pool.close();
                        this.connectionPool = null;
                    }
                }
                else {
                    this.connectionPool = pool;
                    resolve(pool);
                }
            });
        }
        return promise;
    }
}

Каждый раз, когда я пытаюсь получить доступ к базе данных, я вызываю getConnectionPool для получения пула.Тем не менее, когда я пытаюсь проверить какой-то крайний случай, когда бассейн случайно закрыт.Код выше не работает.Кажется, есть несколько состояний для пула.Это:

  • _connected и _connecting имеют значение false
  • _connected имеет значение true и _connecting имеет значение false
  • _connected имеет значение false и _connecting имеет значение

Поскольку несколько мест в моей программе вызывают sql для регистрации чего-либо, может быть несколько вызовов методов для getConnectionPool () в одно и то же время.Для первого запроса sql после того, как пул был случайно закрыт, вызов this.connection.connect должен подойти, но для других последующих вызовов методов будут возвращаться ошибки, поскольку новый пул соединений находится в процессе назначения.Мы столкнулись с ошибками, такими как база данных уже подключена и ошибка ESOCKET.Поэтому я не уверен, что это правильный подход к использованию пула соединений.Как я могу гарантировать, что, как только пул соединений закрыт, он может быть подключен и все последующие SQL-запросы в порядке?Должен ли я установитьTimeout для приостановки метода cll на некоторое время, если _connecting имеет значение true, и проверить значение _connecting позже, чтобы убедиться, что пул установлен до того, как этот SQL-запрос произойдет?

Заранее спасибо.

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