Флаг Thin-режима и указание пути для клиента Oracle переведены в config.js, контроль доступности пула подключений Oracle при создании соединения

This commit is contained in:
Mikhail Chechnev 2026-03-07 00:55:15 +03:00
parent b156ed7556
commit 207d2ada07
5 changed files with 41 additions and 16 deletions

View File

@ -7,16 +7,6 @@
// Тело модуля // Тело модуля
//------------ //------------
//Переменные окружения
/*
Только для СУБД Oracle.
1. NODE_ORACLE_DB_THIN_MODE - Установите значение "1", чтобы использовать режим "тонкого клиента" (Thin-режим)
при подключении к БД (не требует установки Oracle Client).
2. ORACLE_CLIENT_LIB_DIR - Путь к директории с библиотеками Oracle Client,
используется только для работы в режиме "толстого клиента" (Thick-режим), если значение не указано,
то будет использоваться значение из переменной операционной системы PATH.
*/
//Общие параметры //Общие параметры
let common = { let common = {
//Наименование сервера приложений //Наименование сервера приложений
@ -24,7 +14,7 @@ let common = {
//Версия сервера приложений //Версия сервера приложений
sVersion: "8.5.6.1", sVersion: "8.5.6.1",
//Релиз сервера приложений //Релиз сервера приложений
sRelease: "2026.02.10", sRelease: "2026.02.12",
//Таймаут останова сервера (мс) //Таймаут останова сервера (мс)
nTerminateTimeout: 60000, nTerminateTimeout: 60000,
//Контролировать версию Системы //Контролировать версию Системы
@ -44,7 +34,11 @@ let dbConnect = {
//Наименование сервера приложений в сессии БД //Наименование сервера приложений в сессии БД
sSessionAppName: "PARUS$ExchangeServer", sSessionAppName: "PARUS$ExchangeServer",
//Подключаемый модуль обслуживания БД (низкоуровневые функции работы с СУБД) //Подключаемый модуль обслуживания БД (низкоуровневые функции работы с СУБД)
sConnectorModule: "parus_oracle_db.js" sConnectorModule: "parus_oracle_db.js",
//Применение "тонкого" (Thin) или "толстого" (Thick) режима подключения (false - Thick-режим - работа через установленного клиента СУБД Oracle, true - Thin-режим - не требует установки клиента СУБД Oracle, допустим только для Oracle >= 12.1)
bOraUseThinMode: false,
//Путь к домашней директории Oracle Client (только для Thick-режима подключения к СУБД Oracle, если значение не указано, то будет использоваться значение из переменной окружения "PATH" ОС)
sOraClient: ""
}; };
//Параметры обработки очереди исходящих сообщений //Параметры обработки очереди исходящих сообщений

View File

@ -118,7 +118,6 @@ class ParusAppServer {
await this.logger.info( await this.logger.info(
`Обработчик очереди входящих сообщений запущен (порт - ${nPort}, доступные IP - ${sHost === "0.0.0.0" ? getIPs().join("; ") : sHost})` `Обработчик очереди входящих сообщений запущен (порт - ${nPort}, доступные IP - ${sHost === "0.0.0.0" ? getIPs().join("; ") : sHost})`
); );
//Запускаем
//Запускаем модуль отправки уведомлений //Запускаем модуль отправки уведомлений
await this.logger.info("Запуск модуля отправки уведомлений..."); await this.logger.info("Запуск модуля отправки уведомлений...");
try { try {

View File

@ -23,7 +23,13 @@ let appSrv = new app.ParusAppServer(); //Экземпляр сервера пр
//---------------------------------------- //----------------------------------------
//Разрешение на TLS (Transport Layer Security) без авторизации //Разрешение на TLS (Transport Layer Security) без авторизации
process.env.NODE_TLS_REJECT_UNAUTHORIZED = cfg.outGoing.bValidateSSL === false ? "0" : "1"; process.env.NODE_TLS_REJECT_UNAUTHORIZED = cfg?.outGoing?.bValidateSSL === false ? "0" : "1";
//Включение "Токого режима" для Oracle
process.env.NODE_ORACLE_DB_THIN_MODE = cfg?.dbConnect?.bOraUseThinMode === true ? "1" : "0";
//Путь к клиентским библиотекам для Oracle
process.env.ORACLE_CLIENT_LIB_DIR = cfg?.dbConnect?.sOraClient || "";
//Обработка события "выход" жизненного цикла процесса //Обработка события "выход" жизненного цикла процесса
process.on("exit", code => { process.on("exit", code => {

View File

@ -189,6 +189,24 @@ const dbConnect = new Schema({
type: path => `Наименование подключаемого модуля обслуживания БД (${path}) имеет некорректный тип данных (ожидалось - String)`, type: path => `Наименование подключаемого модуля обслуживания БД (${path}) имеет некорректный тип данных (ожидалось - String)`,
required: path => `Не указано наименование подключаемого модуля обслуживания БД (${path})` required: path => `Не указано наименование подключаемого модуля обслуживания БД (${path})`
} }
},
//Признак применения "тонкого" (Thin) или "толстого" (Thick) режима подключения к БД
bOraUseThinMode: {
type: Boolean,
required: true,
message: {
type: path => `Признак режима подключения (Thin/Thick) к БД (${path}) имеет некорректный тип данных (ожидалось - Boolean)`,
required: path => `Не указан признак режима подключения (Thin/Thick) к БД (${path})`
}
},
//Путь к домашней директории Oracle Client
sOraClient: {
type: String,
required: false,
message: {
type: path => `Путь к домашней директории Oracle Client (${path}) имеет некорректный тип данных (ожидалось - String)`,
required: path => `Не указан путь к домашней директории Oracle Client (${path})`
}
} }
}); });

View File

@ -16,7 +16,7 @@ const { makeErrorText } = require("../core/utils"); //Вспомогательн
//Инициализируем Thick-режим до любых подключений к БД //Инициализируем Thick-режим до любых подключений к БД
try { try {
if (typeof oracledb.initOracleClient === "function" && !(process.env.NODE_ORACLE_DB_THIN_MODE === 1)) { if (typeof oracledb.initOracleClient === "function" && !(process.env.NODE_ORACLE_DB_THIN_MODE === "1")) {
const libDir = process.env.ORACLE_CLIENT_LIB_DIR; const libDir = process.env.ORACLE_CLIENT_LIB_DIR;
if (libDir) { if (libDir) {
oracledb.initOracleClient({ libDir }); oracledb.initOracleClient({ libDir });
@ -203,9 +203,10 @@ const clearServer = async prms => {
//Подключение к БД //Подключение к БД
const connect = async prms => { const connect = async prms => {
let pool = null;
try { try {
//Создаем пул подключения //Создаем пул подключения
let pool = await oracledb.createPool({ pool = await oracledb.createPool({
user: prms.sUser, user: prms.sUser,
password: prms.sPassword, password: prms.sPassword,
connectString: prms.sConnectString, connectString: prms.sConnectString,
@ -229,8 +230,15 @@ const connect = async prms => {
}); });
} }
}); });
//Проверяем доступность пула
let tstConn = await pool.getConnection();
await tstConn.close();
//Всё ок - возвращяем его
return pool; return pool;
} catch (e) { } catch (e) {
//Закрываем пул, если успели открыть
if (pool) pool.close(NPOOL_DRAIN_TIME);
//Возвращаем ошибку
throw new Error(e.message); throw new Error(e.message);
} }
}; };