谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!

有没有想过圣诞老人如何为世界各地的孩子们送上节日礼物? 有20亿个孩子,每个孩子都有自己的愿望清单,他会在24小时内完成。 这意味着每个孩子平均需要43微秒,他需要检查每个孩子是否顽皮或好。

您无需再怀疑了。 我会透露这个秘密。 他正在使用Java 11和具有超快执行速度的现代流ORM。

谁去过顽皮,谁去过尼斯? 圣诞老人为您提供Java 11建议!_第1张图片

尽管Santa的后备数据库既旧又慢,但他仍可以使用标准Java流和JVM内存技术来分析数据(微秒)。 圣诞老人的数据库包含两个表。 Child持有每一个孩子的世界, HolidayGift指定可用于生产圣诞老人的车间的所有项目。 一个孩子只能有一个愿望,例如哈希规则。

以流查看数据库

Speedment是一种基于流的现代ORM,它能够将关系数据库表视为标准Java流。 众所周知,只有好孩子才能得到礼物,因此区分顽皮的人和乖的人是很重要的。 使用以下代码可以轻松完成此操作:

var niceChildren = children.stream()
        .filter(Child.NICE.isTrue())
        .sorted(Child.COUNTRY.comparator()) 
        .collect(Collectors.toList());

该流将产生一长串列表,其中仅包含一直很好的孩子。 为了使圣诞老人能够优化其送货路线,该列表按居住国家/地区排序。

参加儿童和假期礼物

该列表似乎不完整。 圣诞老人如何跟踪向谁送的礼物? 现在
HolidayGiftHolidayGift上用场。 由于有些孩子向圣诞老人提供了他们的愿望清单,因此我们现在可以将两个表合并在一起,以构成一个包含所有好孩子及其相应礼物的完整列表。 包括没有任何希望的孩子是很重要的(他们会得到随机的礼物),因此我们加入了左联盟。

var join = joinComponent
    .from(ChildManager.IDENTIFIER)
        .where(Child.NICE.isTrue())
    .leftJoinOn(HolidayGift.GIFT_ID).equal(Child.GIFT_ID)
    .build(Tuples::of);

Speedment正在使用构建器模式创建Join对象,然后可以反复使用该对象以创建具有类型元素的流
T 。 在这种情况下,它用于HolidayGift ChildHolidayGift 。 该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 memory
    santasWorkshop.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

你可能感兴趣的:(数据库,java,mysql,大数据,python)