不知道有没有人关注过TechEmpower的Web Framework Benchmarkshttps://www.techempower.com/benchmarks/ ),一种把各种Web后端开发技术都罗列起来,在同样的机器下跑最简单的业务逻辑,来对比各技术性能的竞赛。参与跑分的技术代码,都是开源的,甚至很多代码就是由Web技术本身的作者维护的。
虽说,跑分不能代表性能,性能更不能代表技术的优劣。但是有着么一个性能维度的粗浅比较,还是能带给我们不一样的收获。
比如,在2018-06-06的最新一场比拼中,Vert.x搭配PostgreSQL的组合,在部分比试时表现十分抢眼,性能一骑绝尘且大幅领先第二名。被它踩在脚下摩擦的对手,不乏我们熟知的技术方案,比如gonodejsspringphp,还有mysqlmongodb等数据库。(这里我无意引战,有兴趣的朋友可以查看具体跑分结果相关代码
查看具体跑分代码可知,Vert.x之所以能位居榜首,与其使用的数据库客户端是密不可分的。作为一套基于Java的技术解决方案,Vert.x没有使用Java程序员所熟知的JDBC,而是使用了一种叫reactive-pg-client的技术。
reactive-pg-clientJDBC最大的区别就是前者是针对PostgreSQL数据库单独开发的,利用了PostgreSQL异步特性,最大限度了挖掘了数据库的访问性能。
现在我们就来简单尝试下reactive-pg-client,首先添加依赖

compile 'io.reactiverse:reactive-pg-client:0.10.3'

准备PgPoolOptions

PgPoolOptions options = new PgPoolOptions()
.setPort(5432)
.setHost("the-host")
.setDatabase("the-db")
.setUser("user")
.setPassword("secret")
.setMaxSize(5);

接下来就可以用了

// Create the client pool
PgPool client = PgClient.pool(options);

// A simple query
client.query("SELECT * FROM users WHERE id='julien'", ar -> {
if (ar.succeeded()) {
PgRowSet result = ar.result();
System.out.println("Got " + result.size() + " rows ");
} else {
System.out.println("Failure: " + ar.cause().getMessage());
}

// Now close the pool
client.close();
});

典型的异步代码编写风格,正是由于该库先天异步的特性,我们可以用一个线程,就能控制多个数据库链接(The client is reactive and non blocking, allowing to handle many database connections with a single thread.),籍此获得更好的计算机资源利用率,从而提高性能。更多信息请查看官方文档reactive-pg-client

明天,我将继续深入reactive-pg-client,带你尝试PostgreSQL独有的NOTIFY特性,实现从数据库端到业务程序段的数据主动推送。