JDBC звонки в Scala Future - PullRequest
5 голосов
/ 11 мая 2019

Я пишу веб-API HTTP Akka, который подключается к экземпляру базы данных Oracle с помощью OJDCB.

Насколько мне известно, отсутствует асинхронный JDBC API для подключения к базе данных, а также нет реализации обратного вызова,следовательно, поток процесса должен быть заблокирован, чтобы завершить вызов.

Мой вопрос таков: наличие этого Akka HTTP, естественно, позволяет обрабатывать запросы с помощью Scala Future. Хорошая идея - просто обернуть вызов базы данных вScala Future?Основной поток простаивает в ожидании ответа базы данных?

1 Ответ

4 голосов
/ 11 мая 2019

Не работает ли основной поток в ожидании ответа базы данных? Да, поток блокируется до завершения вызова 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...