有没有想过圣诞老人如何为世界各地的孩子们送上节日礼物? 有20亿个孩子,每个孩子都有自己的愿望清单,他会在24小时内完成。 这意味着每个孩子平均需要43微秒,他需要检查每个孩子是否顽皮或好。
您无需再怀疑了。 我会透露这个秘密。 他正在使用Java 11和具有超快执行速度的现代流ORM。
尽管Santa的后备数据库既旧又慢,但他仍可以使用标准Java流和JVM内存技术来分析数据(微秒)。 圣诞老人的数据库包含两个表。 Child
持有每一个孩子的世界, HolidayGift
指定可用于生产圣诞老人的车间的所有项目。 一个孩子只能有一个愿望,例如哈希规则。
以流查看数据库
Speedment是一种基于流的现代ORM,它能够将关系数据库表视为标准Java流。 众所周知,只有好孩子才能得到礼物,因此区分顽皮的孩子和善良的孩子很重要。 使用以下代码可以轻松完成此操作:
var niceChildren = children.stream().filter(Child.NICE.isTrue()).sorted(Child.COUNTRY.comparator()) .collect(Collectors.toList());
该流将产生一长串列表,其中仅包含一直很好的孩子。 为了使圣诞老人能够优化其送货路线,该列表按居住国家/地区排序。
参加儿童和假期礼物
该列表似乎不完整。 圣诞老人如何跟踪向谁送的礼物? 现在
HolidayGift
表HolidayGift
上用场。 由于有些孩子向圣诞老人提供了他们的愿望清单,因此我们现在可以将两个表合并在一起,以构成一个包含所有好孩子及其礼物的完整列表。 包括没有任何希望的孩子是很重要的(他们会得到随机的礼物),因此我们加入了左联盟。
var join = joinComponent.from(ChildManager.IDENTIFIER).where(Child.NICE.isTrue()).leftJoinOn(HolidayGift.GIFT_ID).equal(Child.GIFT_ID).build(Tuples::of);
Speedment正在使用构建器模式创建Join<T>
对象,然后可以反复使用该对象以创建具有类型元素的流
T
。 在这种情况下,它用于HolidayGift
Child
和HolidayGift
。 该gift_id
仅包括gift_id
并且匹配在gift_id
字段中包含相同值的gift_id
。
这是圣诞老人交付所有包裹的方式:
join.stream().parallel() .forEach(SleighUtil::deliver);
可以看出,圣诞老人可以轻松运送所有由驯鹿携带的带有平行雪橇的包裹。
这将使流呈现为有效的SQL查询,但不幸的是,它还不足以及时完成。
使用JVM中的内存加速
现在到有趣的部分。 Santa正在激活Speedment中的JVM内存中加速组件,称为DataStore。 这可以通过以下方式完成:
var santasWorkshop = new ApplicationBuilder().withPassword("north-pole")// Activate DataStore.withBundle(DataStoreBundle.class).build();// Load a snapshot of the database into off-heap memorysantasWorkshop.get(DataStoreComponent.class).ifPresent(DataStoreComponent::load);
此启动配置是对应用程序唯一需要的调整。 以上所有流构造均保持不变。 启动应用程序时,数据库的快照被拉入JVM,并以堆外方式存储。 由于数据是堆外存储的,因此不会影响垃圾回收,并且数据量仅受可用RAM的限制。 由于圣诞老人正在使用云服务,因此无法阻止它加载TB的数据,并且可以轻松扩展其RAM。 现在,该应用程序将更快地运行一个数量级,Santa能够及时交付所有软件包。
使用In-JVM-Memory加速运行您自己的项目
如果您想亲自尝试数据库应用程序的速度,可以在此处找到一个Initializer。 只需输入所需的数据库类型(Oracle,MySQL,MariaDB,PostgreSQL,Microsoft SQL Server,DB2或AS400),您就会得到一个POM和一个为您自动生成的应用程序模板。
如果您需要更多帮助来设置项目,请查看Speedment
GitHub页面或浏览用户指南 。
s
感谢Julia Gustafsson和Carina Dreifeldt共同撰写本文。
翻译自: https://www.javacodegeeks.com/2018/12/naughty-nice-santa-gives-java-11-advice.html