Ivan Yurchenko
Ivan Yurchenko

Reputation: 566

What are the options to use JDBC in a non-blocking way in Play?

I wonder what is the best (recommended, approved etc.) way to do non-blocking JDBC queries in Play! application using Play's connection pool (in Scala and to PostgreSQL if it matters)? I understand that JDBC is definitely blocking per se, but surely there are approaches to do the calls in separated threads (e.g. using futures or actors) to avoid blocking of the calling thread.

Suppose I decided to wrap the calls in futures, which execution context should I use, the Play's default one? Or it's better to create separated execution context for handling DB queries?

I know that there are some libraries for this like postgresql-async, but I really want to understand the mechanics :)

Upvotes: 6

Views: 3284

Answers (2)

fxfour
fxfour

Reputation: 143

Suppose I decided to wrap the calls in futures, which execution context should I use, the Play's default one?

If you do that, you gain nothing, it's like not using futures at all. Wrapping blocking calls in futures only helps you if you execute them in separate execution contexts.

In Play, you can basically choose between the following two approaches when dealing with blocking IO:

  • Turn Play into a one-thread-per-request Framework by drastically increasing the default execution context. No futures needed, just call your blocking database as always. Simple, but not the intention behind Play
  • Create specific execution contexts for your blocking IO-calls and gain fine-grained control of what you are doing

See the docs: "Understanding Play thread pools"

Upvotes: 1

Eugene Loy
Eugene Loy

Reputation: 12416

Suppose I decided to wrap the calls in futures, which execution context should I use, the Play's default one? Or it's better to create separated execution context for handling DB queries?

It is better to use separate execution context in this case. This way there will be no chance that your non-blocking jobs (most of the default Play's stuff) submitted to default execution context will be jammed by blocking JDBC calls in jobs you submit to the same execution context.

I suggest to read this (especially second part) to get a general idea of how you could deal with execution contexts in different situations (including case with blocking database queries), and then refer this to get more details on configuring your scenario in Play.

Upvotes: 5

Related Questions