需求调研 现有系统梳理_对速度的需求,访问现有数据的速度提高了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;我的个性很独立而且蛮…

QPW 点评点赞日志表(tf_appraise_praise)

点评点赞日志表 CREATE TABLE tf_appraise_praise (praise_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 点赞ID,user_id bigint(20) DEFAULT NULL COMMENT 用户ID,appraise_id bigint(20) DEFAULT NULL COMMENT 点评ID,status smallint(6) DEFAULT NULL COMMENT 状态, # 这…

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;…

QPW 邀请日志表(tf_invite_log)

邀请日志表 被邀请者注册成功后&#xff0c;往这张表插入一条记录&#xff0c;记录在何时谁邀请了谁。 CREATE TABLE tf_invite_log (invite_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 邀请ID,user_id bigint(20) DEFAULT NULL COMMENT 用户ID, # 邀请用户IDinvited_us…

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…

查询英文缩写形式(缩写词)的网站工具梳理

国外 https://www.abbreviations.com/ 点评&#xff1a;比较靠谱&#xff0c;大部分单词查询到的缩写形式是正确的 https://www.acronymfinder.com/ 点评&#xff1a;不是很靠谱&#xff0c;很多单词查询到的缩写形式是错误的 国内 http://shortof.com/ 点评&#xff1a…

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;但是给他看一些卡片&…

关于编号/编码命名的问题

文章目录概述订单号命名概述 银行卡账号、员工编号、分店编号、单据编号、单据流水号、部门编号&#xff0c;基本都是用 Number 命名&#xff0c;缩写 NO。 分析&#xff1a;在实际的业务中&#xff0c;很多以 Number 命名的编号里面通常只有阿拉伯数字&#xff0c;没有其它字…

c# java 哪个好 流媒体_C#Net7mma H264 / PCMU流媒体

我在创建一个包含音频和视频音频和视频的流时遇到问题 . 我正在为rtsp服务器使用net7mma库 . 我正在播放视频给wowza . 我得到了H264 / AVC视频流和PCMU 44,1k采样率视频流 . 这就是我这样做的方式&#xff1a;首先我创建媒体&#xff1a;RFC6184Media newMedia new RFC6184Me…

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…

QPW 企业员工表(tf_company_employee)

文章目录员工表字段说明员工表 CREATE TABLE tf_company_employee (employee_id bigint(20) NOT NULL COMMENT 职员Id,employee_no varchar(15) NOT NULL COMMENT 职员编号, # &#xff08;补&#xff09;管理员自定义&#xff0c;可以为空&#xff0c;但是非空时不许重复&…

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;的特色库。 。 该…

QPW 用户签到日志表(tf_user_signin_log)

用户签到日志表 CREATE TABLE tf_user_signin_log (signin_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 签到ID,user_id bigint(20) DEFAULT NULL COMMENT 用户ID,insert_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间,update_time timestamp NOT …