Nodejs Knex -таблица параллельных вызовов oracle заблокирована

#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#numberofthreads

5. Я зарегистрировал это в Knex: github.com/knex/knex/issues/4076