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 Production 和Slick Doc。
來源
2016-02-21 14:31:10
Sky
使用fork-join線程池確實不是一個好主意,但是如何確保HTTP API數據庫調用總是優先於使用slick 3.0的後臺作業,因爲使用了相同的執行上下文? – Chris
我無法正確理解您的問題。爲此,你需要展示一些代碼。如果你想使用scala默認的ExecutionContext,那就OK了。 – Sky
您需要增加默認線程池中的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