2016-02-19 26 views
2

我們在Spray-io(1.3.3)中使用Slick(2.1.0)。目前我們正面臨一個問題,因爲我們對Spray HTTP API部分和訪問同一數據庫的後臺運行作業使用相同的執行上下文。所有數據庫/阻塞調用都使用相同的scala.concurrent.ExecutionContext.global執行上下文封裝在期貨中。Slick 2.1/3執行上下文使用的最佳實踐

當後臺作業開始繁重工作時,它們會佔用所有可用的線程,這將導致API端超時,因爲它們沒有任何可用的線程來處理API工作。 顯而易見的解決方案是對於總線程數不高於配置的數據庫連接池(HikariCP)的兩個部件使用不同的執行上下文。 (這裏部分建議使用https://www.playframework.com/documentation/2.1.0/ThreadPools#Many-specific-thread-pools),但如何將這種設置與Slick 3配合使用,其中執行上下文與DB配置本身相關聯?

回答

1

Slick3帶有自己的執行上下文和線程的數量configurable.You可以調整所有的連接池設置示例(MySQL的):

dev-dbconf={ 
dataSourceClass = "com.mysql.jdbc.jdbc2.optional.MysqlDataSource" 
numThreads  = 10 //for execution context 
maxConnections = 10 
minConnections = 5 
connectionTimeout = 10000 
initializationFailFast = false 
properties { 
    user   = "root" 
    password  = "root" 
    databaseName = "db_name" 
    serverName = "localhost" 
} 

}

在這種配置,您可以更改號碼的線程根據您的要求。 我想建議你從未使用IO的「scala.concurrent.ExecutionContext.global」。由於默認的ExecutionContext自帶的fork-join線程池是不利於IO.You可以爲IO創建自己的線程池:

import scala.concurrent.ExecutionContext 
import java.util.concurrent.Executors 

object MyExecutionContext { 

    private val concorrency = Runtime.getRuntime.availableProcessors() 
    private val factor = 3 // get from configuration file 
    private val noOfThread = concorrency * factor 
    implicit val ioThreadPool: ExecutionContext = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(noOfThread)) 

} 
    // Use this execution context for IO instead of scala execution context. 
import MyExecutionContext.ioThreadPool 

Future{ 
// your blocking IO code 
} 

您可以根據您的要求改變noOfThread。如果您根據您的機器中的編號處理器設置線程數量,那就太好了。

欲瞭解更多信息,你可以看到Best Practices for Using Slick on ProductionSlick Doc

+0

使用fork-join線程池確實不是一個好主意,但是如何確保HTTP API數據庫調用總是優先於使用slick 3.0的後臺作業,因爲使用了相同的執行上下文? – Chris

+0

我無法正確理解您的問題。爲此,你需要展示一些代碼。如果你想使用scala默認的ExecutionContext,那就OK了。 – Sky

+0

您需要增加默認線程池中的noOfThread。缺省情況下它是x1.means noOfThread =(數如果處理器)* 1. 可以通過 1)scala.concurrent.context.minThreads 2)scala.concurrent.context.numThreads 3)設置scala.concurrent.context.maxThreads 詳情請參閱: http://stackoverflow.com/questions/14207762/set-the-parallelism-level-for-all-collections-in-scala-2-10/ 14291710#14291710 和 https://github.com/scala/scala/blob/2.11.x/src/library/scala/concurrent/impl/ExecutionContextImpl.scala – Sky