#node.js #oracle #knex.js
#node.js #Oracle #knex.js
Вопрос:
Я использую Knex npm в качестве конструктора запросов. версия 0.20.11. Версия узла 12.16.1
Размер пула
Минимум -3 Максимум -500
Мои сервисы выполняют какой-то длительный процесс, вставляют и обновляют более 2 таблиц, наконец, фиксируют транзакцию.
я даю одновременный вызов более 150-200 для моей службы. Таблица заблокирована.служба зависает.Невозможно передать даже один поток после блокировки таблицы.
я использую knex.transaction, я фиксирую и уничтожаю свое соединение после завершения службы.
пожалуйста, подскажите мне, как решить эту проблему, если кто-либо сталкивался с такого рода проблемами.
Примечание: работает нормально при минимальном количестве потоков
Ответ №1:
Если вы увеличили размер пула соединений, а затем увеличили UV_THREADPOOL_SIZE
, см. Документацию node-oracledb «Соединения, потоки и параллелизм«. Как показано, убедитесь, что это значение установлено перед Node.js запускается пул потоков. В Windows он должен быть установлен перед Node.js само собой исполняется. Поэтому лучший способ — установить значение в качестве переменной среды. Например, в Linux у вас package.json
может быть сценарий, подобный:
"scripts": {
"start": "export UV_THREADPOOL_SIZE=10 amp;amp; node index.js"
},
. . .
Или, в Windows:
"scripts": {
"start": "SET UV_THREADPOOL_SIZE=10 amp;amp; node index.js"
},
. . .
Knex в настоящее время пытается установить значение внутри: кажется, слишком поздно, а также не будет работать в Windows.
Также убедитесь, что вы закрываете соединения после использования во всех местах, включая процедуры ошибок.
Комментарии:
1. Спасибо за ваш ответ. Но у меня была та же ошибка. Каково максимальное значение UV_THREADPOOL_SIZE..
2. внутри knex npm в oracle dialect был код для автоматического увеличения UV_THREADPOOL_SIZE.
3. Используя jmeter, я передал 100 одновременных потоков одному из наших api, который вставит запись в таблицу. в oracle создано 100 сеансов (4 активных и 96 неактивных). Но ничего не происходит. Потоки просто ждут. Тем не менее, я понятия не имею, как преодолеть этот сценарий.
4. Я бы с подозрением относился к любым настройкам внутри кода. Если
UV_THREADPOOL_SIZE
значение не установлено до запуска пула потоков, по-прежнему будет использоваться размер по умолчанию 4. Это означает, что это действительно должно быть самым первым в базе кода. Также настройкаprocess.env.UV_THREADPOOL_SIZE
в Node.js приложения при запуске в Windows игнорируются. Тот факт, что вы видели 4 активных сеанса, является очень сильной подсказкой. Поэтому попробуйте установить переменную среды перед запуском приложения, например, в вашем package.json. Смотрите Документ node-oracledb oracle.github.io/node-oracledb/doc/api.html#numberofthreads5. Я зарегистрировал это в Knex: github.com/knex/knex/issues/4076