需求调研 现有系统梳理_对速度的需求,访问现有数据的速度提高了1000倍

需求调研 现有系统梳理

了解如何通过使用标准Java 8流和Speedment的In-JVM-Memory加速器将分析数据库应用程序加速1000倍。

Web和移动应用程序有时会很慢,因为后备数据库很慢和/或与数据库的连接施加了延迟。 现代的UI和交互式应用程序需要快速后端,并且理想情况下没有可观察到的延迟,否则用户将继续使用其他服务,或者只会感到厌倦并完全停止使用该服务。

在本文中,我们将学习如何使用标准Java 8流和Speedment的in-JVM内存加速技术将分析数据库应用程序加速几个数量级。 最后,我们将运行具有代表性基准的JMH测试服,这些基准表明加速因子超过1,000倍。

以流查看数据库

速度是基于ORM的现代流,这意味着表被视为标准Java 8流。 在本文中,我们将使用“ Sakila”数据库,这是一个开放源代码示例数据库,可直接从Oracle 这里获得 。 Sakila示例数据库包含电影,演员等。 这是来自数据库的Java 8流的样子:

List<Film> secondPage = films.stream().filter(Film.RATING.equal("PG-13")).sorted(Film.TITLE.comparator()).skip(50).limit(50).collect(Collectors.toList());

该流将仅过滤出评级等于“ PG-13”的电影,然后按电影标题对其余电影进行排序。 之后,将跳过前50部电影,然后将接下来的50部电影收集到列表中。 因此,我们获得了按标题顺序排序的所有PG-13电影的第二页。 通常,我们还需要知道总共有多少部电影的评级为“ PG-13”,以便在我们的应用程序中显示正确缩放的滚动条。 可以这样完成:

long count = films.stream().filter(Film.RATING.equal("PG-13")).count();

使用数据库

Speedment将自动将Streams呈现为SQL。 这样,我们可以保持在纯类型安全的Java环境中,而不必编写SQL代码。 通过启用日志记录,我们可以看到第一个分页流将呈现给以下SQL查询(假设我们正在使用MySQL):

SELECT`film_id`,`title`,`description``release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update` 
FROM `sakila`.`film` 
WHERE (`sakila`.`film`.`rating`  = ? COLLATE utf8_bin) 
ORDER BY `sakila`.`film`.`title` ASC 
LIMIT ? OFFSET ?values:[PG-13, 50, 50]

第二个计数流将呈现为:

SELECT COUNT(*) FROM (SELECT`film_id`,`title`,`description``release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update`FROM`sakila`.`film` WHERE (`sakila`.`film`.`rating`  = ? COLLATE utf8_bin)
) AS Avalues:[PG-13]

因此,将流操作呈现为有效SQL。 当在具有MySQL标准服务器配置的笔记本电脑类计算机上并行运行一千个查询时,它们分别在700毫秒和175毫秒的总延迟中完成。 如果您正在考虑第二条SQL语句如何有效,那么事实是数据库将基本上可以消除内部选择。

使用JVM中的内存加速

现在到有趣的部分。 让我们在应用程序中激活Speedment中的JVM内存中加速组件,称为DataStore。 这是通过以下方式完成的:

SakilaApplication app = new SakilaApplicationBuilder().withPassword("sakila-password")// Activate DataStore.withBundle(DataStoreBundle.class).build();// Load a snapshot of the database into off heap memoryapp.get(DataStoreComponent.class).ifPresent(DataStoreComponent::load);

启动应用程序时,数据库的快照被拉入JVM,并以堆外方式存储。 由于数据是非堆存储的,因此数据不会影响垃圾收集,并且数据量仅受可用RAM的限制。 如果我们有那么多的可用RAM,没有什么可以阻止我们加载数TB的数据。

如果现在再次运行同一应用程序,则将获得22毫秒和1毫秒的总延迟。 这意味着等待时间分别减少了30倍和170倍。 必须说是一个重大改进。 但是,它还在变得更好。

使用JVM中的内存加速和Json

REST和JSON通常用于为最近请求数据的客户端提供服务。 Speedment有一个特殊的收集器,可以使用所谓的就地反序列化来收集JSON数据,从而仅从收集器中反序列化收集器所需的字段。 我们可以通过首先在pom文件中添加依赖项来依赖Json插件:

<dependency><groupId>com.speedment.enterprise.plugins</groupId><artifactId>json-stream</artifactId><version>${speedment.enterprise.version}</version></dependency>

然后,我们将插件安装在ApplicationBuilder中,如下所示:

SakilaApplication app = new SakilaApplicationBuilder().withPassword("sakila-password").withBundle(DataStoreBundle.class)// Install the Json Plugin.withBundle(JsonBundle.class).build();

如果我们只想让json输出中的Film字段“ title”,“ rating”和“ length”,我们可以创建一个Json编码器,如下所示:

final JsonComponent json = app.getOrThrow(JsonComponent.class);final JsonEncoder<Film> filmEncoder = json.<Film>emptyEncoder().put(Film.TITLE).put(Film.RATING).put(Film.LENGTH).build();

该解码器是不可变的,可以在我们的应用程序中反复使用:

String json = films.stream().filter(Film.RATING.equal("PG-13")).sorted(Film.TITLE.comparator()).skip(50 * pageNo).limit(50).collect(JsonCollectors.toList(filmEncoder));

与处理整个实体相比,这为我们提供了2的额外加速因子。 JsonComponent可以做的不仅仅是将事情收集到列表中。 例如,它还可以使用就地反序列化来创建聚合。

通过In-JVM-Memory加速运行自己的项目

自己尝试在JVM-Memory中加速很容易。 在这里可以找到免费的初始化器。 只需在所需的数据库类型中打勾,您便会自动为您生成一个POM和一个应用程序模板。 您还需要许可证密钥才能运行。 只需在同一页面上单击“请求免费试用许可证密钥”即可获得一个。 如果需要更多帮助来设置项目,请查看Speedment GitHub页面或浏览手册 。

Real的速度有多快?

Speedment支持多种数据库类型,包括Oracle,MySQL,MariaDB,PostgreSQL,Microsoft SQL Server,DB2和AS400。 Speedment也可以使用Hadoop使用的Avro文件。 在此示例中,我们将运行MySQL。

众所周知,在Java应用程序中测试性能非常困难。 使用JMH框架,我编写了许多典型的应用程序,每个应用程序都运行了数十万次,并将纯MySQL和MySQL与Speedment的in-JVM加速器的结果进行了比较。 以下性能数据以每秒操作数的形式给出(越高越好)。

基准测试 纯MySQL 带有Speedment in-JVMMySQL 加速因素
数一数 5,324 43,615,967 8,000
用过滤器计数 5,107 2,465,928 400
筛选 449 597,702 1,300
排序 109 171,304 1,500
分页 1,547 1,443,015 900
遍历所有 108 5,556 50
聚合 117 167,728 1,400
聚集过滤器 453 608,763 1,300

可以看出,在大多数情况下,带有Speedment In-JVM加速器MySQL比纯MySQL的性能高出1,000倍。 观察到的最小加速因子是50倍,这仍然非常好。

测试环境

MySQL,5.7.16标准安装,MySQL JDBC驱动程序5.1.42,Oracle Java 1.8.0_131,Speedment Enterprise 1.1.10,macOS Sierra 10.12.6,Macbook Pro 2.2 GHz i7(2015年中),16 GB RAM。

基准代码

以下是基准代码外观的一些示例。 完整的基准测试应用程序可以在GitHub上找到 。 我鼓励您克隆它并运行它,以查看您自己的目标计算机上的加速因素。

@Benchmarkpublic String paging() {return films.stream().filter(Film.RATING.equal("PG-13")).skip(50).limit(50).collect(filmCollector);}@Benchmarkpublic String aggregationWithFilter() {return films.stream().filter(Film.RATING.equal("PG-13")).collect(sumLengthCollector);}

需要多少RAM?

速度通常比数据库本身更有效地将数据存储在RAM中。 基准测试中的Sakila数据库在磁盘上占用6.6 MB,但Speedment仅使用3 MB内存。 考虑到默认情况下,Speedment对所有列进行索引,而数据库仅对少数列进行索引,因此Speedment显着提高了内存效率。

加载数据需要多长时间?

Sakila数据库在不到1秒的时间内就被Speedment加载并建立索引。 Speedment可以在后台从数据库刷新数据,并且可以跟踪针对哪个数据库快照版本(MVCC)运行的流。

我自己的应用程序可以运行多少速度?

任何人都可以猜测,在一个特定项目中可以减少多少延迟。 是x10,x50,x100还是更多? 抓住机会,找出自己的项目可以提高多少速度!

旋转一下

在GitHub上了解有关Speedment的更多信息,并使用Speedment Initializer启动您自己的项目,并记住勾选“启用内存中加速”,并使用初始化程序也获得免费的评估许可证密钥。 在此处浏览有关Speedment in-JVM加速器的手册部分,或使用我的Twitter句柄@PMinborg

翻译自: https://www.javacodegeeks.com/2017/09/need-speed-access-existing-data-1000x-faster.html

需求调研 现有系统梳理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

order by 影响效率么_提升开发效率N倍的20+命令行神器

图 by&#xff1a;石头青海湖关于作者&#xff1a;程序猿石头(ID: tangleithu)&#xff0c;现任阿里巴巴技术专家&#xff0c;清华学渣&#xff0c;前大疆后端 Leader。以每篇文章都让人有收获为目的&#xff0c;欢迎关注&#xff0c;交流和指导&#xff01;背景本文主要来源于…

超级酒吧女生Java下载_超真实分享:一个人去酒吧的经验+注意事项

原标题&#xff1a;超真实分享&#xff1a;一个人去酒吧的经验&#xff0b;注意事项今天想跟大家分享我自己一个很奇妙也很特别的经验&#xff0c;就是关于我自己一个人去酒吧喝酒的故事&#xff5e;对这个故事有好奇心的女孩欢迎跟我一起聊聊&#xff5e;我的个性很独立而且蛮…

java parse_Java命令行界面(第9部分):parse-cmd

java parseparse-cmd库由单个类ParseCmd.java组成&#xff0c;该类是“用于在Java应用程序中定义和解析命令行参数的Java类。” 该库托管在Google Code存档上 &#xff0c;因此可以随时关闭 。 该JAR似乎也可以在GitHub上使用 。 这篇文章介绍了如何使用parse-cmd 0.0.93处理Ja…

mysql 聚簇索引和非聚簇索引_MySQL学习之——索引

转自&#xff1a;CSDNMySQL是目前绝大多数互联网公司使用的关系型数据库&#xff0c;它性能出色、资源丰富、成本低廉&#xff0c;是快速搭建互联网应用的首选关系型数据库。但是&#xff0c;俗话说&#xff0c;“好马配好鞍”&#xff0c;仅仅会使用MySQL是不够的&#xff0c;…

java登录界面命令_Java命令行界面(第10部分):picocli

java登录界面命令picocli主页面将picocli描述为“强大的微小命令行界面”&#xff0c;“ picocli”是一个单文件Java框架&#xff0c;用于解析命令行参数并生成精美&#xff0c;易于定制的用法帮助消息。 有颜色。” 这篇文章简要概述了如何使用Picocli 0.9.7处理Java代码中的命…

navicat运行sql文件慢_SQL进阶之路——入门

一、初步了解SQL数据库&#xff1a;用来存放数据关系数据库&#xff1a;1.含有多张表 2.各表之间有关系关系数据库中表的样式&#xff1a;a.每个表1个表名 b.每个表中包含记录列名的列和记录数据的行 c.利用主键用来标识数据的唯一性关系数据库中每个表之间如何建立联系&#x…

java登录界面命令_Java命令行界面(第19部分):jClap

java登录界面命令本系列中第19个帖子的重点是从Java代码解析命令行参数是jClap &#xff08; Java命令行参数解析器 &#xff09;&#xff0c;不应与JCLAP库混淆&#xff0c;该库是我本系列前 一篇文章的重点。 上 一篇 文章介绍了Giles Winstanley&#xff08; snaq.net &…

weka分类器怎么设置样本类别_【程序喵笔记】小样本学习1.0

小样本学习前几天接触小样本学习 Few-Shot Learning&#xff0c;感觉很是有意思。看到Shusen Wang老师的讲解&#xff0c;感觉很棒~持续学习~学会学习 Lean to learn小朋友去动物园&#xff0c;见到未知的动物&#xff0c;他虽然不知道类别&#xff0c;但是给他看一些卡片&…

maven 生成本地库_在2017年从Maven工件生成P2存储库

maven 生成本地库几年前&#xff0c;我写了一篇博客文章&#xff0c;介绍如何基于Maven工件生成P2存储库。 如今&#xff0c;这种描述的方法已经过时了&#xff0c;我想展示一种基于p2-maven-plugin的新方法&#xff0c;该方法是为解决此问题而创建的。 Maven构建生命周期中的…

java 状态模式 同步_JAVA设计模式之状态模式

在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的&#xff1a;状态模式&#xff0c;又称状态对象模式(Pattern of Objects for States)&#xff0c;状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改…

python列表修改_python修改列表

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; 由于惯性思维&#xff0c;导致使用for循环修改列表中的值出现问题首次尝试&#xff1a;def make_great(orig…

python装饰器作用和功能_Python装饰器原理与用法分析

这篇文章主要介绍了Python装饰器原理与用法,结合实例形式分析了Python装饰器的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下 本文实例讲述了Python装饰器原理与用法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 1、装饰器的本质是函数&#xff0c…

java登录界面命令_Java命令行界面(第16部分):JArgp

java登录界面命令这篇文章中介绍的基于Java的命令行参数处理库是IBM developerWorks文章Java编程动态性&#xff0c;第3部分&#xff0c;应用的反射 &#xff08;第2003 部分&#xff0c;此归档文章于2016年“归档”&#xff0c;但仍可通过PDF下载 &#xff09;的特色库。 。 该…

tnsnames.ora配置未生效_1分钟了解网络交换机的6种命令配置模式

我们在配置交换机的时候首先要了解的就是交换机命令模式&#xff0c;小编用Cisco思科交换机为例带大家了解交换机的6种配置模式。Cisco IOS提供了用户EXEC模式和特权EXEC模式两种基本的命令执行级别&#xff0c;同时还提供了全局配置、接口配置、Line配置和vlan数据库配置等多种…

java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

java 线程中创建线程在JDK 8之前&#xff0c;还没有办法在Java中创建大型的线程安全的ConcurrentHashSet。 java.util.concurrent包甚至没有一个名为ConcurrentHashSet的类&#xff0c;但是从JDK 8开始&#xff0c;您可以使用新添加的keySet&#xff08;默认值&#xff09;和ne…

docker 删除所有镜像_关于 Docker 镜像的操作,看完这篇就够啦 !(下)| 文末福利...

紧接着上篇《关于 Docker 镜像的操作&#xff0c;看完这篇就够啦 !(上)》&#xff0c;奉上下篇 &#xff01;&#xff01;&#xff01;镜像作为 Docker 三大核心概念中最重要的一个关键词&#xff0c;它有很多操作&#xff0c;是您想学习容器技术不得不掌握的。本文将带您一步一…

python与access选哪个_从Python连接到Access

I want to be connected to a database Boreas (Access) from Python. How to be connected from Python to Access database Northwind? 解决方案 Here are 2 ways, with COM dispatch and with odbc. You will need the pywin32 extensions and/or pyodbc to use these meth…

设备唯一标识/设备码/设备标识码

文章目录一、MAC地址二、IMEI三、MEIDMEID 和 IMEI 用途的区别四、序列号&#xff08;一&#xff09;苹果手机序列号&#xff08;二&#xff09;华为手机序列号一、MAC地址 MAC地址&#xff08;英语&#xff1a;Media Access Control Address&#xff09;&#xff0c;直译为媒…

java登录界面命令_Java命令行界面(第18部分):JCLAP

java登录界面命令Giles Winstanley的JCLAP &#xff08; Java命令行参数解析器 &#xff09;是基于Java的命令行处理库的系列文章中介绍的第18个库。 这篇文章的示例基于JCLAP 1.4 &#xff0c;它需要Java 8 。 JCLAP主页上指出&#xff1a;“ JCLAP帮助Java开发人员为其应用程…

java登录界面命令_Java命令行界面(第15部分):Jargo

java登录界面命令Jargo在其GitHub主页上定义为“一种减轻程序参数/选项处理的工具”。 当已经存在许多其他命令行处理库时&#xff0c;该页面为另一个命令行处理库提供了基本原理 &#xff0c;该列表的顶部是“因为类型安全性&#xff0c;不变性和可读性很重要”。 Jargo的选项…