Scala ScalikeJdbc有线程池时为什么需要执行上下文?

Scala ScalikeJdbc有线程池时为什么需要执行上下文?,scala,scalikejdbc,Scala,Scalikejdbc,在本例中,执行上下文用于处理未来 当Scalike有一个内置的连接池时,为什么要使用它 将来不应该使用一个池线程来执行吗?当另一个线程进行IO工作时,加入一个线程只是为了等待未来,这似乎是一种真正的浪费 当Scalike有一个内置的连接池时,为什么要使用它 连接池不是线程池。连接池只是由某个对象保存的开放数据库连接的集合,该对象负责打开、关闭连接,并将其提供给其他API。连接池通常对线程一无所知。您可以有一个连接池,其中有50个打开的连接,但是如果您的应用程序只有一个线程,那么一次只能使用一个

在本例中,执行上下文用于处理未来

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

将来不应该使用一个池线程来执行吗?当另一个线程进行IO工作时,加入一个线程只是为了等待未来,这似乎是一种真正的浪费

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

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

需要一个
ExecutionContext
,以便您可以以任何方式提供自己的线程池。这可能意味着默认的上下文
scala.concurrent.ExecutionContext.Implicit.global
、一个固定线程池或您自己创建的fork-join池等。这允许您根据性能需要调整应用程序,而不必受制于单个
ExecutionContext

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

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

需要一个
ExecutionContext
,以便您可以以任何方式提供自己的线程池。这可能意味着默认的上下文
scala.concurrent.ExecutionContext.Implicit.global
、一个固定线程池或您自己创建的fork-join池等。这允许您根据性能需要调整应用程序,而不必受制于单个
ExecutionContext

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(_))