2016-02-19 38 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