上篇我们讨论了静态数据源(Static Source, snapshot).这种方式只能在预知数据规模有限的情况下使用,对于超大型的数据库表也可以说是不安全的资源使用方式.Slick3.x已经增加了支持Reactive-Streams功能,可以通过Reactive-Streams API来实现有限内存空间内的无限规模数据读取,这正符合了FunDA的设计理念:高效.便捷.安全的后台数据处理工具库.我们在前面几篇讨论里介绍了Iteratee模式,play-iteratees支持Reactive-St…
我们在前面用了许多章节来讨论如何把数据从后台数据库中搬到内存,然后进行逐行操作运算.我们选定的解决方案是把后台数据转换成内存中的数据流.无论在打开数据库表或从数据库读取数据等环节都涉及到对数据库表这项资源的安全使用:我们最起码要保证在完成使用或者使用中途出现错误异常退出时能释放占用的资源.谈到资源使用安全,不得不想到函数式编程通用的那个bracket函数,fs2同样提供了这个函数: def bracket[F[_],R,A](r: F[R])(use: R => Stream[F,A], rel…
上节我们探讨了通过scalaz-stream-fs2来驱动一套数据处理流程,用fs2的Pipe类型来实现对数据流的逐行操作.本篇讨论准备在上节讨论的基础上对数据流的流动和元素操作进行优化完善.如数据流动中增加诸如next.skip.eof功能.内容控制中增加对行元素的append.insert.update.remove等操作方法.但是经过一番对fs2的再次解读,发现这些操作模式并不像我所想象那样的方式,实际上用fs2来实现数据行控制可能会更加简单和直接.这是因为与传统数据库行浏览方式不同的是f…
FunDA是一种函数式的编程工具,它所产生的程序是由许多功能单一的细小函数组合而成,这些函数就是用户自定义操作函数了.我们在前面曾经提过FunDA的运作原理模拟了数据流管道.流元素在管道流动的过程中被使用或者更新.在管道中流动的元素都必须继承FDAROW类型,可以细分成几个大类: 1.数据行(data-row):因为FunDA的数据行必须是强类型的,所以各种case class类型继承了FDAROW(extends FDAROW)之后最为适合 2.动作行(action-row):case cla…
FunDA设计的主要目的是解决FRM(Functional Relation Mapping)如Slick这样的批次型操作工具库数据源行间游动操作的缺失问题.FRM产生的结果集就是一种静态集合,缺乏动态更新操作方式.FunDA提出的解决方案是把FRM产生的静态集合转变成动态流(stream),流内元素代表数据行(data row),一个完整的数据流代表一连串的数据行.用户可以利用数据流和FunDA提供的函数组件在数据流中游动进行数据更新操作.FunDA的数据流只支持单向游动(fda_next),…
FunDA最重要的设计目标之一就是能够实现数据库操作的并行运算.我们先重温一下fs2是如何实现并行运算的.我们用interleave.merge.either这几种方式来同时处理两个Stream里的元素.interleave保留了固定的交叉排列顺序,而merge和either则会产生不特定顺序,这个现象可以从下面的例子里看到: ) ) //当前元素跟踪显示 def log[A](pre: String): Pipe[Task,A,A] = _.evalMap { row => Task.dela…
FunDA的设计目标就是把后台数据库中的数据搬到内存里,然后进行包括并行运算的数据处理,最后可能再对后台数据库进行更新.如果需要把数据搬到内存的话,那我们就必须考虑内存是否能一次性容纳所有的数据,有必要配合数据处理分部逐步读入,这就是Reactive Stream规范主要目的之一.所以在设计FunDA的数据源(Source)之前必须要考虑实现reacive-data-stream.Slick 3.x版在功能上的突破之一就是实现了对Reactive-Stream API的支持.遗憾的是新版的Sli…
在上节讨论里我们介绍了数据行流式操作的设想,主要目的是把后台数据库的数据载入前端内存再拆分为强类型的数据行,这样我们可以对每行数据进行使用和处理.形象点描述就是对内存里的一个数据流(data-stream)进行逐行操作.我们在上节用foreach模拟了一个流控来示范数据行的操作处理.在这节我们讨论一下用scalaz-stream-fs2作为数据流管理工具来实现FunDA的数据行流动管理功能.fs2的Stream是一种自然的拖动型(pull-model)数据流.而fs2的Pipe类型则像是管道的阀…
作为一个能安全运行的工具库,为了保证占用资源的安全性,对异常处理(exception handling)和事后处理(final clean-up)的支持是不可或缺的.FunDA的数据流FDAPipeLine一般是通过读取数据库数据形成数据源开始的.为了保证每个数据源都能被安全的使用,FunDA提供了事后处理finalizing程序接口来实现数据流使用完毕后的清理及异常处理(error-handling)程序接口来捕获和处理使用过程中出现的异常情况.首先,事后处理程序(finalizer)保证了在…
FunDA的并行运算施用就是对用户自定义函数的并行运算.原理上就是把一个输入流截分成多个输入流并行地输入到一个自定义函数的多个运行实例.这些函数运行实例同时在各自不同的线程里同步运算直至耗尽所有输入.并行运算的具体函数实例数是用fs2-nondeterminism的算法根据CPU内核数.线程池配置和用户指定的最大运算实例数来决定的.我们在这次示范里可以对比一下同样工作内容的并行运算和串形运算效率.在前面示范里我们获取了一个AQMRPT表.但这个表不够合理化(normalized):state和c…