性能封神的数据库访问库reactive-pg-client初探
不知道有没有人关注过TechEmpower的Web Framework Benchmarks
(https://www.techempower.com/benchmarks/ ),一种把各种Web
后端开发技术都罗列起来,在同样的机器下跑最简单的业务逻辑,来对比各技术性能的竞赛。参与跑分的技术代码,都是开源的,甚至很多代码就是由Web
技术本身的作者维护的。
虽说,跑分不能代表性能,性能更不能代表技术的优劣。但是有着么一个性能维度的粗浅比较,还是能带给我们不一样的收获。
比如,在2018-06-06
的最新一场比拼中,Vert.x
搭配PostgreSQL
的组合,在部分比试时表现十分抢眼,性能一骑绝尘且大幅领先第二名。被它踩在脚下摩擦的对手,不乏我们熟知的技术方案,比如go
、nodejs
、spring
、php
,还有mysql
、mongodb
等数据库。(这里我无意引战,有兴趣的朋友可以查看具体跑分结果及相关代码)
查看具体跑分代码可知,Vert.x
之所以能位居榜首,与其使用的数据库客户端是密不可分的。作为一套基于Java
的技术解决方案,Vert.x
没有使用Java
程序员所熟知的JDBC
,而是使用了一种叫reactive-pg-client的技术。reactive-pg-client
与JDBC
最大的区别就是前者是针对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
特性,实现从数据库端到业务程序段的数据主动推送。
- 本文链接:http://www.kankanzhijian.com/2018/09/14/reactive-pg-client_start/
- 版权声明:本博客文章均系本人原创,转载请注名出处
分享