#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. Можно ли это сделать?