Knex не использует шов для ожидания освобождения sqlite

#node.js #sqlite #knex.js #node-cluster

#node.js #sqlite #knex.js #узел-кластер

Вопрос:

Недавно я реализовал Node cluster как способ вертикального масштабирования моего приложения. Поскольку теперь он использует несколько потоков, я, естественно, добавил стресс-тесты в приложение, и это выявило проблему с моим приложением.

Поэтому ради этого вопроса я действительно упрощу свою настройку. У меня есть кластеризованное приложение, и каждый из дочерних процессов обращается к одному и тому же файлу SQLite. Я знаю, что это не идеальное решение, но, насколько мне известно, когда параллельные запросы пытаются получить к нему доступ, последнему следует дождаться освобождения базы данных. К сожалению, этого не происходит.

Я получаю следующую ошибку

Ошибка: SQLITE_BUSY: база данных заблокирована
errno: 5, код: ‘SQLITE_BUSY’

Моя конфигурация

 "sqlite": {
  "client": "sqlite3",
  "connection": {
    "filename": "app/database/database.sqlite"
  },
  "useNullAsDefault" : true,
  "pool": {
    "min": 1,
    "max": 1 <- i tried increasing this to the number of cluster instances
  }
}
  

Есть ли решение для этого, кроме удаления SQLite в целом?

Комментарии:

1. Подождите некоторое время и повторите попытку. Если привязки узлов предоставляют способ вызова собственной sqlite3_busy_timeout() функции C, это может быть сделано автоматически. В противном случае используйте PRAGMA busy_timeout .

2. ам? ждать чего? Как долго ждать? ИМХО, это должно быть сделано соединителем базы данных: подождите в очереди, пока блокировка будет снята, или умрите с таймаутом . Есть ли способ добиться этого с помощью knex?

3. Как долго ждать, зависит от вас и потребностей приложения. Обычно я использую 250-500 миллисекунд.

4. Да ладно, это был риторический вопрос. Я, очевидно, не хочу восстанавливаться после ошибки тайм-аута, и мне бы очень не хотелось, чтобы меня заставляли делать это вручную (подождите и повторите попытку). Я покажу это как ошибку недоступности службы. Реальный вопрос здесь заключается в том, КАК установить время ожидания занятости с помощью knex. Можно ли это сделать?