我正在尝试了解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池。
答案 0 :(得分:1)
不完全确定,但配置了默认调度程序,可在此处找到:
import play.api.libs.concurrent.Execution.Implicits._
implicit
关键字的第二个参数来使用它,因此使用导入的执行conntext。
Tomcat jdbc库对此没有了解,所以我想如果你不自己配置它就会创建一个带有一些默认值的线程池,并且它与akka创建的线程池没有任何关联。
所以我猜你需要寻找tomcat的池配置而不是播放。
如果您不介意我也会尝试查看其他“为scala设计”框架来处理数据库。 我的选择是光滑的+像BoneCP这样的库