在Play中以非阻塞方式使用JDBC有哪些选择?

时间:2014-10-03 10:42:00

标签: scala jdbc playframework

我想知道在Play中进行非阻塞JDBC查询的最佳(推荐,批准等)方式是什么!使用Play的连接池的应用程序(如果重要的话,在Scala和PostgreSQL中)?我理解JDBC本身肯定是阻塞的,但肯定有方法在分离的线程中进行调用(例如使用future或actors)以避免阻塞调用线程。

假设我决定在期货中包含调用,我应该使用执行上下文,Play的默认调用?或者最好为处理数据库查询创建单独的执行上下文?

我知道有一些像postgresql-async这样的库,但我真的想了解这些机制:)

2 个答案:

答案 0 :(得分:4)

  

假设我决定在期货中包含调用,我应该使用执行上下文,Play的默认调用?或者,为处理数据库查询创建单独的执行上下文会更好吗?

在这种情况下,最好使用单独的执行上下文。这样,提交到默认执行上下文的非阻塞作业(大多数默认Play内容)将无法通过阻止您提交到同一执行上下文的作业中的JDBC调用来阻塞。

我建议阅读this(特别是第二部分),以便大致了解如何在不同情况下处理执行上下文(包括阻止数据库查询的情况),然后参考this获取有关在Play中配置方案的更多详细信息。

答案 1 :(得分:1)

  

假设我决定将期货包裹在执行中   我应该使用上下文,Play的默认值吗?

如果你这样做,你什么也得不到,就像根本没有使用期货一样。在期货中包装阻塞调用只有在单独的执行上下文中执行它们时才会有所帮助。

在Play中,您可以在处理阻止IO时基本上选择以下两种方法:

  • 通过大幅增加默认执行上下文,将Play转换为每个请求一个线程的框架。不需要期货,只需像往常一样调用您的阻止数据库。简单,但不是Play背后的意图
  • 为阻止IO调用创建特定的执行上下文,并对您正在执行的操作进行细粒度控制

请参阅docs: "Understanding Play thread pools"