从postgresql 14之后,它的客户端库提供了pipelining模式接口,在pipelining模式下,新sql请求可以直接发送到服务端而不必等到上一个请求的结果返回(这和HTTP的pipelining的概念一致),详情请参考Pipeline mode。该模式对性能有很大的帮助,可以使较少的数据库连接就支持较大的并发请求。 drogon在1.7.6版本之后开始支持,drogon会自动检查libpq是否支持pipeline模式,如果支持的话,通过drogon的DbClient发送的所有请求都是在pipeline模式下的。
不过,每条sql语句创建一个同步点也有比较大的性能开销,因此drogon提供了一种自动批处理模式,在该模式下,同步点的创建不再是每条sql之后都创建一个,而是若干sql语句之后创建,同一个链接创建同步点的规则如下:
- 一个EventLoop循环之内的最后一条sql之后必然创建同步点;
- 一个写数据库的sql之后创建同步点;
- 上一个同步点之后连续的sql语句数量达到上限的时候创建同步点;
- 一个失败的sql会导致它之前的到上一个同步点之后的sql语句都发生回滚,但用户并不会收到相关通知,因为没有使用显式事务;
- 写数据库的sql判别是靠简单的关键字匹配(insert,update等关键字),这并不能涵盖所有的情况,比如通过select调用了存储过程的情况,因此虽然drogon努力减少自动批处理的负面影响,但它不是绝对安全的;
所以,自动批处理模式对性能提高有一定帮助,但它并不安全,由用户自己决定在什么情况下使用它,比如纯只读的sql使用自动批处理模式的DbClient。
当使用newPgClient接口创建客户端时,把第三个参数设为true即可使能自动批处理模式; 当使用配置文件创建客户端时,把auto_batch选项设为true即可使能该客户端的自动批处理模式;