From 207d2ada07beb81aa9cc53eb6adda2f500b9da1a Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Sat, 7 Mar 2026 00:55:15 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A4=D0=BB=D0=B0=D0=B3=20Thin-=D1=80=D0=B5?= =?UTF-8?q?=D0=B6=D0=B8=D0=BC=D0=B0=20=D0=B8=20=D1=83=D0=BA=D0=B0=D0=B7?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=83=D1=82=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=D0=B0=20Ora?= =?UTF-8?q?cle=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B2=20config.js,=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=20=D0=B4=D0=BE=D1=81=D1=82=D1=83=D0=BF=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=BF=D1=83=D0=BB=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=20?= =?UTF-8?q?Oracle=20=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B8=20=D1=81=D0=BE=D0=B5=D0=B4=D0=B8=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.js | 18 ++++++------------ core/app.js | 1 - index.js | 8 +++++++- models/obj_config.js | 18 ++++++++++++++++++ modules/parus_oracle_db.js | 12 ++++++++++-- 5 files changed, 41 insertions(+), 16 deletions(-) diff --git a/config.js b/config.js index 007234e..d9bd0e9 100644 --- a/config.js +++ b/config.js @@ -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 = { //Наименование сервера приложений @@ -24,7 +14,7 @@ let common = { //Версия сервера приложений sVersion: "8.5.6.1", //Релиз сервера приложений - sRelease: "2026.02.10", + sRelease: "2026.02.12", //Таймаут останова сервера (мс) nTerminateTimeout: 60000, //Контролировать версию Системы @@ -44,7 +34,11 @@ let dbConnect = { //Наименование сервера приложений в сессии БД 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: "" }; //Параметры обработки очереди исходящих сообщений diff --git a/core/app.js b/core/app.js index e3fb918..0ed2969 100644 --- a/core/app.js +++ b/core/app.js @@ -118,7 +118,6 @@ class ParusAppServer { await this.logger.info( `Обработчик очереди входящих сообщений запущен (порт - ${nPort}, доступные IP - ${sHost === "0.0.0.0" ? getIPs().join("; ") : sHost})` ); - //Запускаем //Запускаем модуль отправки уведомлений await this.logger.info("Запуск модуля отправки уведомлений..."); try { diff --git a/index.js b/index.js index 84ff42b..ee343bc 100644 --- a/index.js +++ b/index.js @@ -23,7 +23,13 @@ let appSrv = new app.ParusAppServer(); //Экземпляр сервера пр //---------------------------------------- //Разрешение на 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 => { diff --git a/models/obj_config.js b/models/obj_config.js index 7cea9df..05eba66 100644 --- a/models/obj_config.js +++ b/models/obj_config.js @@ -189,6 +189,24 @@ const dbConnect = new Schema({ type: path => `Наименование подключаемого модуля обслуживания БД (${path}) имеет некорректный тип данных (ожидалось - String)`, 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})` + } } }); diff --git a/modules/parus_oracle_db.js b/modules/parus_oracle_db.js index b5c2311..daab4a7 100644 --- a/modules/parus_oracle_db.js +++ b/modules/parus_oracle_db.js @@ -16,7 +16,7 @@ const { makeErrorText } = require("../core/utils"); //Вспомогательн //Инициализируем Thick-режим до любых подключений к БД 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; if (libDir) { oracledb.initOracleClient({ libDir }); @@ -203,9 +203,10 @@ const clearServer = async prms => { //Подключение к БД const connect = async prms => { + let pool = null; try { //Создаем пул подключения - let pool = await oracledb.createPool({ + pool = await oracledb.createPool({ user: prms.sUser, password: prms.sPassword, connectString: prms.sConnectString, @@ -229,8 +230,15 @@ const connect = async prms => { }); } }); + //Проверяем доступность пула + let tstConn = await pool.getConnection(); + await tstConn.close(); + //Всё ок - возвращяем его return pool; } catch (e) { + //Закрываем пул, если успели открыть + if (pool) pool.close(NPOOL_DRAIN_TIME); + //Возвращаем ошибку throw new Error(e.message); } };