Не работает ли основной поток в ожидании ответа базы данных? Да, поток блокируется до завершения вызова JDBC.Это не очень хорошая вещь, но до тех пор, пока adba не будет готов, есть вероятно лучшего варианта нет.
Это обычный шаблон для использования Future для блокирования ввода-вывода , например JDBC вызовов.Есть некоторые вещи, которые следует учитывать, хотя.На эту тему есть отличная статья на github .
Несколько моментов, чтобы подвести итог описанным в статье вещам:
обернуть ваши блокирующие вызовы внутриБлок blocking
, например:
def fetchUser(id: Long): Future[User] = Future {
blocking { //mark this operation as blocking
...
preparedStatement.execute()
...
}
}
, вы не должны использовать scala.concurrent.ExecutionContext.Implicits.global
для фьючерсов, которые делают какие-либо блокировки, потому что вы могли бы истощить пул потоков.Вам лучше создать отдельный пул потоков для операций блокировки:
object BlockingIOExecutionContext {
implicit val ec: ExecutionContextExecutor = ExecutionContext.fromExecutor(
Executors.newCachedThreadPool()
) // create seperate thread pool for our blocking operations
}
Лучшим вариантом для вас будет просто использовать какие-то зрелые фреймворки Scala, которые делают это дляВы, как пятно или Doobie .