Что делать при попадании в очередь размером слика?

Я использую Slick 3.0 с HikariCP 2.3.8 (также играю 2.4)

Я делаю много операций ввода-вывода в базу данных и постоянно достигаю предела очереди. Есть ли способ получить текущий размер очереди и как его увеличить? Или это даже рекомендуется делать, или лучше использовать оболочку вокруг базы данных с собственной очередью?

Исключение, о котором я говорю:

java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$2@39496345 rejected from java.util.concurrent.ThreadPoolExecutor@21ee20b4[Running, pool size = 20, active threads = 20, queued tasks = 1000, completed tasks = 7021]

person Pius Friesch    schedule 27.07.2015    source источник


Ответы (2)


1000 задач в очереди мне кажется много. Очевидно, что slick использует исполнителя с очередью фиксированного размера (1000 элементов), и вы упираетесь в этот предел, потому что задачи удаляются недостаточно быстро.

Наиболее очевидная причина — время выполнения SQL. Если вы сможете сократить время выполнения SQL, вы купите себе много места в очереди.

Как правило, это делается на стороне базы данных, проверяя планы выполнения запросов и, в зависимости от базы данных, запрашивая у базы данных, каковы длительные запросы.

На стороне HikariCP вы можете включить метрики DropWizard (не знаете, как сделайте это с помощью slick) и включите DropWizard log reporter для регистрации статистики пула каждые 10 секунд или около того.

Вероятно, наиболее интересной метрикой будет использование, поскольку она покажет вам, как долго соединения находятся вне пула между getConnection() и close(). Когда вы настраиваете свою базу данных и/или запросы, вы хотите, чтобы это число начало снижаться.

Одним из важных моментов является то, что если база данных не справляется с нагрузкой вашего приложения, увеличение гладкой очереди с 1000 до 5000 (или даже 10000) не даст вам ничего, кроме небольшого количества времени, прежде чем она достигнет этого предела. Вы должны найти источник узкого места производительности и устранить его, чтобы очереди удалялись быстрее, чем ваше приложение их генерирует (конечно, за исключением временных всплесков).

person brettw    schedule 28.07.2015
comment
Может быть, мне нужно уточнить, что каждую минуту я ставлю в очередь много, и это нормально, что требуется некоторое время для обработки. Но это также означает, что очередь сразу становится большой. Поэтому я подумал, что простым решением будет увеличение размера очереди. Так что все в порядке с этими длинными sql-запросами, если они завершаются в течение минуты. Побочный вопрос: вставка коллекции via++= ставит каждый элемент в очередь или вся коллекция является одной задачей? - person Pius Friesch; 28.07.2015

При использовании Database.forConfig можно указать другое значение размера очереди.

отличная документация

person Pius Friesch    schedule 30.07.2015