Quill NDBC Postgres: A New Async Module

29 Nov 2019

Quill NDBC Postgres: A New Async Module

1 minute read

Quill 3.5.0 is out and this release brings an integration with the already mentioned NDBC Driver. This post is a brief summary about the new module quill-ndbc-postgres.

Motivation

Quill has an asynchronous module called quill-async which provides support to MySQL and Postgres databases. This module is built on top of mauricio/postgresql-async: a Netty based, database drivers for Postgres and MySQL written in Scala. It is a great solution, and we have been using it for a while now.

But all of sudden, this issue appeared:

Wait… what?

Well, it happens. A replacement is necessary.

NDBC: Non-blocking Database Connectivity

NDBC’s goal is to provide a full asynchronous approach to handle databases. It is built using Netty and Trane.io Futures, a High-performance Future implementation for the JVM. Sounds’s like a good replacement!

Took me some time to implement it, but a few days ago my pull request integrating NDBC got merged. Now we have an alternative to quill-async-postgres; async support via NDBC driver is available with Postgres database.

Quill + NDBC

To replace the deprecated driver just a few changes are necessary. First, add quill-ndbc-postgres to your dependencies:

libraryDependencies ++= Seq(
  "io.getquill" %% "quill-ndbc-postgres" % "3.4.11"
)

The application.properties needs to change as well:

ctx.ndbc.dataSourceSupplierClass=io.trane.ndbc.postgres.netty4.DataSourceSupplier
ctx.ndbc.host=database-host
ctx.ndbc.port=1234
ctx.ndbc.user=username
ctx.ndbc.password=password
ctx.ndbc.database=dbname

The main difference is the first line, NDBC needs to know which data source supplier class to use, for Postgres it is io.trane.ndbc.postgres.netty4.DataSourceSupplier.

Even though NDBC is written on top of Netty, we keep the api and implementation apart. This way we can build another implementation, on top of Akka, for instance.

Now we have everything in place to start using NdbcPostgresContext:

val ctx = new NdbcPostgresContext(Literal, "ctx")

That’s all, fairly straightforward. When you start using it, let me know how it goes for you in the comments, or please open an issue at the project’s github.

The next step is the MySQL implementation. I will let you know when it happens :)

Comments