1

在此示例中,执行上下文用于处理未来。

当 Scalike 有一个内置的连接池时,为什么要使用它?

Future 不应该使用其中一个池线程来执行吗?ForkJoin 一个线程只是为了等待 Future 而另一个线程执行 IO 工作似乎是一种真正的浪费。

http://scalikejdbc.org/documentation/transaction.html

object FutureDB {
  implicit val ec = myOwnExecutorContext
  def updateFirstName(id: Int, firstName: String)(implicit session: DBSession): Future[Int] = {
    Future { 
      blocking {
        session.update("update users set first_name = ? where id = ?", firstName, id)
      } 
    }
  }
  def updateLastName(id: Int, lastName: String)(implicit session: DBSession): Future[Int] = {
    Future { 
      blocking {
        session.update("update users set last_name = ? where id = ?", lastName, id)
      } 
    }
  }
}

object Example {
  import FutureDB._
  val fResult = DB futureLocalTx { implicit s =>  
    updateFirstName(3, "John").map(_ => updateLastName(3, "Smith"))
  }
}

Example.fResult.foreach(println(_))
4

1 回答 1

4

当 Scalike 有一个内置的连接池时,为什么要使用它?

连接池不是线程池。连接池只是由一些对象保存的开放数据库连接的集合,这些对象处理打开、关闭和将它们提供给其他 API。连接池通常对线程一无所知。您可以拥有一个包含 50 个打开连接的连接池,但如果您的应用程序只有一个线程,您一次只能使用一个线程(使用这样的阻塞 API),因为通过连接执行查询将阻止调用它的任何线程。

AnExecutionContext是必需的,以便您可以以任何您想要的方式提供自己的线程池。这可能意味着默认上下文scala.concurrent.ExecutionContext.Implicit.global、固定线程池或您自己创建的分叉连接池等。这允许您根据性能需求调整应用程序,而不会被束缚在单个ExecutionContext.

于 2015-09-05T17:26:24.583 回答