如何借助 NoSQL 提高 JPA 应用性能

【编者按】关注 NoSQL 的动态发展很重要。NoSQL 的好处并不仅限于新的应用开发。在某些案例中,你可以见识到重新访问现有的、传统的框架带来的积极效果,比如说你的 JPA 的实现。本文系国内 ITOM 管理平台 OneAPM 编译呈现。

多年以前,笔者在为一家世界顶级汽车公司做电子商务网站项目时,曾经碰到过一个听起来像科幻故事的概念:通过实体类别来自动实现数据持久存储。

是的,笔者说的就是现在大家都知道的分布式组件标准(Enterprise JavaBeans)。发布于1998年,后来被并入 Java EE 的技术规范,它引入了实体(Entity Beans)的概念。当时的想法是提供一个开发框架,让开发者可以将他们的对象自动映射到相关表格,这样该框架就可以在数据库中持续自动将应用程序数据持久存储。这被称为 ORM:对象关系映射。

当时是21世纪初,大家还习惯于等待当时最牛的太阳微系统公司(Sun Microsystem)——跟现在苹果公司的地位差不多——带来各种重大发明,不过那可真的是模式的变更。它是紧跟面向对象编程(Object Oriented programming)出现的概念,不过它本身对主流应用开发世界来说就是一个重大的模式转变。当时,在一个集中的数据库中持久存储数据的概念已经得到广泛接受,关系数据库也有很多。服务器端 web 应用开始成为主流,当然,你还得选择存储数据的数据库,虽然关系数据库并不是唯一的选择,但它们是当时所谓的“桌面应用”的首选。这些都表明,应用存储和检索数据的唯一方式是通过执行 SQL 查询。在很多情况下,这种操作是非常复杂的。

与之相反,Java 完全是面向对象的,不会被理解为表格和关系。关系数据库很容易就能被其他过程式语言借助 SQL 来采用。当时,Java 还饱受微软和太阳间的诉讼的影响,该诉讼涉及到 Java 和 IE 间的兼容性。开发者们都在讨论哪个平台或者框架能够胜出:Java 还是微软新发布的 .NET

在这种背景下,EJB 提出的自动持久存储是个令人欣喜,同时又极富创新的概念。不过,当时的硬件现实条件摆出了一个挑战:虽然这个概念不错,但是当时的处理硬件尚未准备好。Java 的问题已经足够证明,被认为是“老派做法”的运行解释代码并不会降低所有进程的速度。在 EJB 要求的多层额外管理中执行这样的代码,更是超出想象。还有别忘了,我们说的是32位单核处理器时代,高端服务器的内存也不过 256 MB 到512 MB!(参考 topdesignmag.com

时间快进到2016年,Hibernate 已经发布了第5版,根据最新调查,超过73%的 Java 开发是在某个 Java EE 框架下进行的。

自2009年起,随着 JPA 2.0 的规范出台,越来越多的应用从这种抽象概念中受益。Gavin King 于2001年开发的 Hibernate ORM 得到广泛使用,更是起到了推动作用,这是由前 EJB2 式实体类别提供的更简单的持久化能力实现方法。由于被认证为2010 JPA 2.0 规范的一种实施方法,Hibernate 成为应用开发者们广泛推崇和使用的技术。

然而,发布15年以来,开发者论坛关于最初主题的讨论依然有很多:如何改善 JPA 的性能表现。虽然硬件速度有了很大提升,同样的问题依然存在。如今 JPA 成了主流技术,影响着世界上数以万计的系统,这个问题就变得更加重要。ORM 架构内在的问题并没有改变:将面向对象的世界映射到关系世界并不是个小任务,需要付出大量的额外努力才能实现无缝对接。

很多年前,Ted Neward 把 ORM 称为“计算机世界的越南”,把它跟收益递减规律联系在一起:一开始看起来很好,但是你用得越多,要获得额外收益就越难。在某些时候,因为前期已经付出了资金和时间,你很难“放弃诱饵,转身跑掉”。他甚至还建议同时使用 ORM 方案和直接的 SQL 方案(或者 JDBC),这样“就可以绕过那些 ORM 会带来麻烦的地方”。这跟性能表现有很大关系。

jhades.org 的成员在他们的博客中提出了一个很好的观点,他们说,ORM 给自己带来的主要问题是挑战(实时)同步两个完全不同的数据结构。表格、关系和面向对象这几个数据结构之间并没有什么相似性。结果就是,传统的关系数据库管理系统在所有的 ORM 实施过程中的表现都有所降低,就是因为 SQL 与这些受益于 ORM 的应用之间没有相似性,也就是所谓的领域驱动设计(Domain Driven Design)。

但是如今,整个数据库产业都在经历变革。过去15年来,你得很有勇气,才敢避开关系数据库管理系统,使用其他备选方案来持久存储数据——如果你能找到的话,更不要说你还要费尽力气解释自己为什么要这么做。如今,大量 NoSQL 数据库增加了计算机科学出现更多新模式的可能性。说 JPA 不能从中受益简直是大错特错,而且笔者认为它绝对能从中受益。从数据结构的观点来看,要在 JPA 实现方法中持久存储数据,很多 NoSQL 方法都更合理,效果也比表格或关系数据管理系统更好。

笔者的研究似乎表明这是真的。我们最近基于自己的键值存储(key-value store,缩写为 KVS)数据库引擎 c-treeACE V11 发布了一个新的 JPA 实现方法。最初的测试结果表明,在使用 c-treeACE 替代 SQL 数据库后,性能提升了30%。

实现这种效果是通过有效利用一种智能映射方法,能够识别出那些可以在低层级 KVS 中执行的检索,从而避免繁冗、不必要的 SQL。由于 c-treeACE 是一种多模式数据库,与数据库互动的层(Java 持久存储层,缩写为 JPL)能够在 SQL 和 NoSQL 之间自如转换,从而优化每次 query.z 的执行。

总之,关注 NoSQL 的各种动态发展很重要。NoSQL 的好处并不仅限于新的应用开发。在某些案例中,你可以见识到重新访问现有的、传统的框架带来的积极效果,比如说你的 JPA 的实现。无论你是用 Hibernate,或者其他 ORM 框架,数据库替换都会是一个低风险、小投入的项目。你可能会发现,你很快就能节省几千美元。

本文转自 OneAPM 官方博客

原文地址:https://dzone.com/articles/how-to-improve-performance-of-your-jpa-application

时间: 2024-11-02 02:21:20

如何借助 NoSQL 提高 JPA 应用性能的相关文章

如何最大限度提高.NET的性能 (续)

性能    昨天发了一篇如何最大限度提高.NET性能的文章,评论的人不少,在这里非常感谢大家的评论,其中有些是指出文章的一些错误的,在这里感谢那些耐心写评论的老大们,小弟受益不少.      昨天那篇主要是从写代码的一些细节上来提高速度,可能很些是难实际感受到性能的提高,但是作为一名程序员,不断提高自己代码的质量是不断追求的目标.      其实随着硬件的发展,现在硬件的速度已经远远满足大多数人的的需要了,甚至有些人提出算法在现在软件开发中越来越不起作用了.记得以前看过麻省的数据结构视频,讲课的

使用智能优化器提高Oracle的性能极限

oracle|性能|优化  使用智能优化器提高Oracle的性能极限       消耗在准备新的SQL语句的时间是Oracle SQL语句执行时间的最重要的组成部分.但是通过理解Oracle内部产生执行计划的机制,你能够控制Oracle花费在评估连接顺序的时间数量,并且能在大体上提高查询性能.准备执行SQL语句       当SQL语句进入Oracle的库缓存后,在该语句准备执行之前,将执行下列步骤: 1)        语法检查:检查SQL语句拼写是否正确和词序. 2)        语义分析

提高DB2查询性能的常用方法

简介 随着DB2应用的逐渐增多,越来越多的数据库开发人员在项目开发过程中都会遇到查询过于复杂,导致性能难以接受的问题.本文将主要从一个数据库开发者的角度介绍几种常用的方法来提高 DB2 查询的性能,而并不讨论如何通过配置 DB2 的各项参数以及调整服务器环境等方式来提高整个数据库性能的方法.系统配置等工作属于 DBA 的工作范畴,在一般的项目开发中,这对于开发人员都是透明的.本文先对 DB2提供的几种用于提高查询性能的相关工具和命令进行介绍,然后根据笔者的工作经验介绍一些常用的技巧和方法来提高查

设置DB2和AIX与条带技术匹配以提高I/O性能

条带化技术是一种广泛使用的 I/O 负载均衡技术,可以在不增加额外硬件投入的情况下极大的提高 I/O 性能.但是在使用了这种技术的环境中,只有对数据库和操作系统的 I/O 处理有良好的规划和设置,使其与条带化技术相匹配,才能使 I/O 的性能达到最好.本文针对这个主题,以 DB2 数据库和 AIX 操作系统为例,介绍了如何规划和设置好相关的内容. 下面我们分如下几个方面来介绍: 条带化技术介绍 在 DB2 中合理规划和设置条带有关参数 在 AIX 中合理规划和设置条带有关参数 总结 条带化技术介

用智能优化限制提高Oracle数据库性能

Oracle SQL运行时间的最主要的组成部分是花在为执行准备新的SQL语句上的时间.不过,如果了解了可执行计划产生的内在机制,你就可以控制Oracle花费在评估表的连接顺序的时间,并在总体上提高查询的性能. 准备为执行提供的SQL语句 在一个SQL语句进入Oracle库的cache之后.而真正被执行之前,将会依次发生如下事件: 语法检查--检查该SQL语句的拼写和词序是否正确. 语义解析--Oracle根据数据词典(data dictionary)来验证所有的表格(table)和列(colum

提高大容量内存性能,这是你内存大最应该做的事。

现在很多人的内存都有8G.16G甚至32G之类的超大内存,这是我们最应该考虑的是提高大容量内存性能 ,也就是让你的内存能发挥最大的功效.而不是有着大内存且没感觉到比以前低内存快多少.发生这种事就是你电脑设置得不够好. 1 根据我所知道的,可以改3个地方,下面就跟着我一一来修改吧. 3个地方都是在注册表哦,所以我们要先进入注册表编辑器,运行输入:regedit就进入了. 2 第一个要改的是LargeSystemCache的值 LargeSystemCache默认值为4,也就是4M,这个值是系统缓存

使用虚拟化,能够提高服务器的性能吗?

问题描述 我现在有两台2U双路服务器,性能中等,CPU也支持虚拟化.我计划在这两台服务器上,安装多个vmware的虚拟机,并在虚拟机中安装操作系统和我的多个业务系统.业务系统中,有大量的网络通信,也有一部分数据需要写入到数据库中.我想问一下,相比在物理机中安装.运行我的业务系统,在虚拟机中安装运行业务系统,能够提高服务器的性能吗? 解决方案 解决方案二:不能但是能提高安全性和部署配置灵活性

c++-每次读取一个字符存入一个string中,最少读取100个字符,应该如何提高程序的性能?

问题描述 每次读取一个字符存入一个string中,最少读取100个字符,应该如何提高程序的性能? <C++ Primer 第五版>习题9.42 假定你希望每次读取一个字符存入一个string中,而且知道最少需要读取100个字符,应该如何提高程序的性能? 解决方案 string s(100,' ');//事先构造一个100个字符的string对象 while(--) { --//填充s int size =s.size();//保存s的大小 if(s.size()>size)//每次填充检

如何提高磁带存储的性能

磁带存储是目前最实惠,性价比最高的存储媒介--备份数据多,无需用磁盘作缓存.下面就提高磁带存储的性能提出5点. 一.了解您的磁带驱动器 实现良好磁带存储性能的最重要方面就是了解您在备份过程中使用的磁带存储驱动器.多数现代磁带驱动器都属于流磁带驱动器,也就是说它们用于在某一特定速率下传输数据,因此,为了让磁带存储驱动器正常工作,您必须了解它的速率,并在备份和恢复过程中保持其流状态. 那么,我们最开始要做的就是了解所有在用的磁带存储驱动器.您需要了解的第一个问题是磁带驱动器的最大原始(未压缩)传输速