Использование отдельного ExecutionContext для Slick - PullRequest
0 голосов
/ 12 июня 2018

Я использую Play 2.5 с Slick.В документах по этой теме просто говорится, что все управляется модулем Slick and Play Slick.Однако в этом примере печатается Dispatcher[akka.actor.default-dispatcher]:

class MyDbioImpl @Inject()(protected val dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext)
  with HasDatabaseConfigProvider[JdbcProfile] {
  import profile.api._
  def selectSomeStuff(): Future[MyResult] = db.run {
    println(ec)
    [...]
  }
}

Поскольку контекст выполнения печатается внутри db.run, кажется, что весь мой доступ к базе данных также будет выполняться в контексте выполнения по умолчанию.

Я нашел этот ответ на старый вопрос, который в то время решил проблему.Но поскольку это решение устарело, предлагается использовать внедрение зависимостей для получения контекста приложения.Когда я пытаюсь это сделать, я получаю сообщение об ошибке, в котором говорится, что play.akka.actor.slick-context не существует ...

class MyDbioProvider @Inject()(actorSystem: ActorSystem,
                               protected val dbConfigProvider: DatabaseConfigProvider)
  extends Provider[MyDbioImpl] {
  override def get(): MyDbioImpl = {
    val ec = actorSystem.dispatchers.lookup("play.akka.actor.slick-context")
    new MyDbioImpl(dbConfigProvider)(ec)
  }
}

Редактировать: Является ли контекст выполнения Slick «нормальным» контекстом выполнения, которыйопределяется в конфигурационном файле где-нибудь?Где происходит переключение контекста?Я предположил, что точка входа в «мир баз данных» находится на db.run.

1 Ответ

0 голосов
/ 12 июня 2018

Согласно Slick :

Каждая база данных содержит AsyncExecutor, который управляет пулом потоков для асинхронного выполнения действий ввода-вывода базы данных.Его размер является основным параметром для настройки для лучшей производительности объекта базы данных.Следует установить значение, которое вы будете использовать для размера пула соединений в традиционном блокирующем приложении (дополнительную информацию см. В разделе «О размере пула» в документации по HikariCP).При использовании Database.forConfig пул потоков настраивается непосредственно во внешнем файле конфигурации вместе с параметрами соединения.Если вы используете любой другой метод фабрики для получения базы данных, вы можете использовать конфигурацию по умолчанию или указать собственный AsyncExecutor.

По сути, он говорит, что вам не нужно создавать изолированный ExecutionContext, так как Slick ужевнутренне изолирует пул потоков.Любой звонок, который вы делаете на Slick, не является блокирующим, поэтому вы должны использовать по умолчанию ExecutionContext.

...