将Java 8流解析为SQL
当Java 8发行并且人们开始流式处理各种东西时,很快他们就开始想象如果可以以相同的方式使用数据库将有多大的潜力。 本质上,关系数据库由以表状结构组织的巨大数据块组成。 这些结构非常适合进行过滤和映射操作,如SQL语言的SELECT,WHERE和AS语句所示。 人们最初做的事情(包括我在内)是向数据库询问大量数据,然后使用新的炫酷Java 8流处理这些数据。
很快出现的问题是,仅将所有行从数据库移到内存的等待时间就花费了太多时间。 结果是,使用内存中的数据没有太多收益。 即使您可以使用新的Java 8-tools真正搞怪高级功能,但由于性能开销,这种优势并没有真正应用到数据库应用程序中。
当我开始致力于Speedment Open Source项目时,我们很快意识到使用Java 8路数据库的潜力,但是我们确实需要一种智能的方式来处理此性能问题。 在本文中,我将向您展示我们如何使用自定义委托为Stream API解决此问题,以在后台处理流,并优化生成的SQL查询。
假设您在远程主机上的数据库中有一个表User,而您想打印出所有70岁以上的用户的名字。 使用Speedment做到这一点的Java 8方法是:
final UserManager users = speedment.managerOf(User.class);
users.stream().filter(User.AGE.greaterThan(70)).map(User.NAME.get()).forEach(System.out::println);
看到此代码可能会在一开始让您不寒而栗。 我的程序会从数据库下载整个表并在客户端中对其进行过滤吗? 如果我有1亿用户怎么办? 网络延迟足以杀死应用程序! 好吧,实际上不是,因为正如我之前所说,Speedment在终止之前会分析流。
让我们看看幕后发生了什么。 UserManager中的.stream()方法返回Stream接口的自定义实现,该接口包含有关该流的所有元数据,直到该流关闭为止。 终止操作可以使用该元数据来优化流。 调用.forEach时,管道将如下所示:
终止操作(在这种情况下,ForEach随后将开始向后遍历管道以查看是否可以优化。首先,它遇到了从User到String的映射。由于User.NAME字段,Speedment将其识别为Getter函数。可以将Getter解析为SQL,因此将终止操作切换为NAME列的Read操作,并删除map操作。
接下来是.filter操作。 过滤器也被识别为自定义操作,在这种情况下为谓词。 由于它是一个自定义实现,因此它可以包含在SQL查询中使用它所需的所有必需的元数据,因此可以安全地从流中将其删除并附加到Read操作中。
现在,当终止操作查找管道时,它将找到流的源。 到达源后,将把Read操作解析为SQL并提交给SQL管理器。 然后,将使用原始的.forEach使用者终止生成的Stream <String>。 为上面显示的确切代码生成的SQL是:
SELECT `name` FROM `User` WHERE `User`.`age` > 70;
Java代码中无需使用任何更改或特殊操作!
这是一个简单的示例,说明如何通过使用Speedment中的自定义实现在执行之前简化流。 欢迎您查看源代码,并找到使用此技术的更好方法。 它确实帮助我们提高了系统性能,并且可能适用于任何分布式Java-8场景。
直到下一次!
翻译自: https://www.javacodegeeks.com/2016/02/parsing-java-8-streams-sql.html
将Java 8流解析为SQL相关推荐
- sql 解析 java_将Java 8流解析为SQL
sql 解析 java 当Java 8发行并且人们开始流式处理各种东西时,不久之后他们就开始想象如果可以以相同的方式使用数据库将有多大的潜力. 本质上,关系数据库由以表状结构组织的巨大数据块组成. 这 ...
- java字符流解析_Java IO(四):字符流详解
一.字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为一个Unicode字符占用2 ...
- Java 8 Friday Goodies:SQL ResultSet流
在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们已经写了一些关于Java ...
- Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?
昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用? 之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类 ...
- 视音频数据处理入门:H.264视频码流解析(java)
参考文献 : 视音频数据处理入门:H.264视频码流解析 测试文件:H264文件 链接:https://pan.baidu.com/s/1eRTJwTsXTgHf2Ez8Inab1A 提取码:1c7 ...
- java ps h264_从海康28181的PS流解析H264的补充
前文 <简单解析海康PS流获取H264> 针对海康摄像头的PS流解析做了简单处理,基本逻辑是正确的,但最近几个摄像头出现了一些奇怪的问题,需要针对相关现象进行查询. RTP传输层 项目中为 ...
- Java IO流详尽解析
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- Java 8流中的数据库CRUD操作
在开始使用新工具时要克服的最大障碍是让您着手处理小事情. 到目前为止,您可能对新的Java 8 Stream API的工作方式充满信心,但是您可能尚未将其用于数据库查询. 为了帮助您开始使用Strea ...
- JAVA代码审计之WebGoat靶场SQL注入
文章目录 前言 WebGoat IDEA部署靶场 No.1 回显注入 No.2 布尔盲注 No.3 Order by 代审技巧 SQL注入挖掘 SQL注入防御 Fortify体验 总结 前言 为了从自 ...
最新文章
- FileUpload路径
- chrome调试工具高级不完整使用指南(基础篇)
- [ios] iOS中arc的设置与使用
- 吴恩达机器学习week2
- Jupyter运行GitHub里的MXNet源代码
- ubuntu或者fedora下编译淘宝tair key-value-db的开源内存数据库
- python微软产品一般都一个25位的序列号_Python易错点6
- iOS蓝牙开发(三)实现外设功能
- raw数据拆分成rggb四通道,拆分与合成
- 小区广播背景音乐系统IP网络广播解决方案
- 带过期时间的积分系统表设计
- 东汉唯物主义哲学家——王充
- WIN10使用VEH+硬件断点实现不修改代码完成破解
- 程序员码字用那种轴的键盘,敲起来更舒适更快捷,我来帮你分析
- 天河区办理水电、管道煤气、有线电视过户手续所需资料及地址 ...
- php判断无理数,关于e是无理数的证明
- 两步解决XMind发生了错误,请参阅日志文件
- 本次给大家来个简单的一元二次方程求解的编程
- 关于Twinmotion可视化渲染软件初识
- 十五天学会Autodesk Inventor,看完这一系列就够了(二),软件界面
热门文章
- Mybatis-plus 思维导图,让 Mybatis-plus 不再难懂
- jQuery动画与事件概念以及语法
- Spark SQL UDF2的使用
- springboot创建项目2 开发环境的搭建
- php 正则获取html标签,php正则取嵌套html标签
- java语言中的访问权限控制符有哪些,18.Java的访问控制符
- pythonnumpy教程_Python教程:numpy的基本介绍
- 响应对象Response
- 日发帖 发帖频率 发帖时段_先发帖
- ibm liberty_使用Open Liberty的开发模式最大程度地缩短周转时间