2015-09-05 22 views
1

在這個例子中,執行上下文用於處理未來。爲什麼ScalikeJdbc在具有線程池時需要執行上下文?

爲什麼Scalike有內置的連接池時會使用它?

不應該使用其中一個池線程執行嗎? 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(_)) 

回答

3

這是爲什麼時Scalike有一個內置的連接池?

連接池不是線程池。連接池只是一些開放數據庫連接的集合,由某些處理打開,關閉並將其供應給其他API的對象保存。連接池通常對線程一無所知。你可以擁有一個包含50個打開連接的連接池,但是如果你的應用程序只有一個線程,那麼你一次只能使用一個連接池(像這樣的阻塞API),因爲通過連接執行查詢將會阻止任何線程調用它。

需要ExecutionContext以便您可以以任何您想要的方式提供您自己的線程池。這可能意味着您自己創建的默認上下文scala.concurrent.ExecutionContext.Implicit.global,固定線程池或分叉連接池等。這使您可以根據性能需求調整應用程序,而不會受限於單個ExecutionContext

+0

這是有道理的。謝謝。 – BAR

相關問題