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