加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用光滑3.0.0流式结果和Postgresql的正确方法是什么?

发布时间:2020-12-13 16:34:17 所属栏目:百科 来源:网络整理
导读:我想弄清楚如何使用流畅的流媒体.我使用光滑3.0.0与postgres驱动程序 情况如下:服务器必须将客户端的数据序列分割成大小限制(以字节为单位).所以,我写了以下光滑的查询: val sequences = TableQuery[Sequences]def find(userId: Long,timestamp: Long) = s
我想弄清楚如何使用流畅的流媒体.我使用光滑3.0.0与postgres驱动程序

情况如下:服务器必须将客户端的数据序列分割成大小限制(以字节为单位).所以,我写了以下光滑的查询:

val sequences = TableQuery[Sequences]
def find(userId: Long,timestamp: Long) = sequences.filter(s ? s.userId === userId && s.timestamp > timestamp).sortBy(_.timestamp.asc).result
val seq = db.stream(find(0L,0L))

我将seq与akka-streams Source相结合,写了自定义PushPullStage,限制数据大小(以字节为单位),并在达到大小限制时完成上游.它的工作很好.问题是 – 当我查看postgres日志时,我会看到这样的查询
select * from sequence_id = 0和timestamp> 0 order by timestamp;

所以,乍看起来,它似乎是很多(而且不必要的)数据库查询,只在每个查询中使用几个字节.使用Slick进行流式传输的正确方法是什么,以最小化数据库查询并最大限度地利用每个查询中传输的数据?

使用Slick和Postgres进行流式传输的“正确方法”包括三件事:

>必须使用db.stream()
>必须在JDBC驱动程序中禁用autoCommit.一种方法是使查询在事务中通过后缀来实现.
>必须将fetchSize设置为0以外的其他位置,否则postgres将一次性将整个结果集推送到客户端.

例如:

DB.stream(
  find(0L,0L)
    .transactionally
    .withStatementParameters(fetchSize = 1000)
).foreach(println)

有用链接:

https://github.com/slick/slick/issues/1038

https://github.com/slick/slick/issues/809

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读