Я создаю приложение, использующее 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-запрос произойдет?
Заранее спасибо.