关于play的执行上下文和创建我的jdbc线程池的指导

时间:2014-05-05 16:05:05

标签: scala playframework guice slick

我正在尝试了解Play的执行环境以及这与我如何使用google guice的方式完全吻合。

我正在构建的典型控件如下:

@Singleton
class MyController @Inject()(myService: MyService) extends Controller {

  def show(id: Int) = Action {
    val m = myService.getMy(id)
    Ok("this is my name " + m.name
  }

}

MyService正在扩展一个创建apache tomcat jdbc线程池的特性,如:

trait BaseService {
   val ds = LoadApacheJdbcPool.datasource
   val db = Database.forDataSource(ds)
}

现在根据我的理解,这将按照以下内容加载到默认执行上下文中: http://www.playframework.com/documentation/2.1.0/ThreadPools

play {
  akka {
    event-handlers = ["akka.event.slf4j.Slf4jEventHandler"]
    loglevel = WARNING
    actor {
      default-dispatcher = {
        fork-join-executor {
          parallelism-factor = 1.0
          parallelism-max = 24
        }
      }
    }
  }
}

那么这意味着什么,在默认设置(上图)下,这是否意味着最多会创建24个线程?

对我来说真正的问题取决于发生了什么,如何在我自己的执行上下文中创建一个jdbc池(可能有也可能没有多个线程)的注入服务而不是默认值上吗

我读过我可以在将来包装我的调用并明确地传递一个执行上下文,但那是对我的'MyService'的调用,但是已经注入并创建了jdbc池。

1 个答案:

答案 0 :(得分:1)

不完全确定,但配置了默认调度程序,可在此处找到: import play.api.libs.concurrent.Execution.Implicits._

大多数框架通过使用带有implicit关键字的第二个参数来使用它,因此使用导入的执行conntext。

Tomcat jdbc库对此没有了解,所以我想如果你不自己配置它就会创建一个带有一些默认值的线程池,并且它与akka创建的线程池没有任何关联。

所以我猜你需要寻找tomcat的池配置而不是播放。

如果您不介意我也会尝试查看其他“为scala设计”框架来处理数据库。 我的选择是光滑的+像BoneCP这样的库