【编者按】关注 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 能为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

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

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

  1. 提高ASP.net性能的十种方法

    提高ASP.net性能的十种方法 2014-10-24  空城66  摘自 博客园  阅 67  转 1 转藏到我的图书馆   微信分享:   今天无意中看了一篇关于提高ASP.NET性能的文章,个人 ...

  2. 25条提高iOS App性能的建议和技巧

    这篇文章来自iOS Tutorial Team 成员 Marcelo Fabri, 他是 Movile 的一个iOS开发者. Check out his personal website or fol ...

  3. 提高 DHTML 页面性能

    联盟电脑摘要:本文说明了某些DHTML功能对性能的重大影响,并提供了一些提高DHTML页面性能的技巧. 目录 简介 成批处理DHTML更改 使用innerText 使用DOM添加单个元素 扩展SELE ...

  4. 25条提高iOS app性能的方法和技巧

    以下这些技巧分为三个不同那个的级别---基础,中级,高级. 基础 这些技巧你要总是想着实现在你开发的App中. 1. 用ARC去管理内存(Use ARC to Manage Memory) 2.适当的 ...

  5. 用 Function.apply() 的参数数组化来提高 JavaScript程序性能

    我们再来聊聊Function.apply() 在提升程序性能方面的技巧. 我们先从 Math.max() 函数说起, Math.max后面可以接任意个参数,最后返回所有参数中的最大值. 比如 aler ...

  6. 如何提高jQuery的性能

    缓存变量DOM遍历是昂贵的,所以尽量将会重用的元素缓存. // 糟糕 h = $('#element').height(); $('#element').css('height',h-20); // ...

  7. 一个用于每一天JavaScript示例-使用缓存计算(memoization)为了提高应用程序性能

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. 如何提高windows的性能

    默认windows启用了很多的效果,我们可能平时没有注意到,比如什么淡入淡出效果之类的,其实在我看来,这些效果不仅难看,而且影响了windows的性能,下面我就来说说怎么通过关闭这些效果来提高wind ...

  9. 提高磁盘访问性能 - NtfsDisableLastAccessUpdate

    这个技巧可以提高磁盘访问性能,不过仅适用于NTFS文件系统. 我们知道,当在磁盘管理应用程序中列出目录结构时──效果类似“资源管理器”.“文件管理 器”(Windows NT  3.xx/4.0下的称 ...

随机推荐

  1. StreamSets学习系列之StreamSets的Core Tarball方式安装(图文详解)

    不多说,直接上干货! 前期博客 StreamSets学习系列之StreamSets支持多种安装方式[Core Tarball.Cloudera Parcel .Full Tarball .Full R ...

  2. mpvue小程序图片404

    mpvue开发小程序时候,要添加静态本地图片 <img src="../../images/bg.png" alt=""> 会报错: VM14878 ...

  3. jemalloc总结

    jemalloc支持SMP系统和并发多线程,多线程的支持是依赖于多个'arenas',并且一个线程第一次调用内存mallocer,与其相关联的是一个特殊的arena. 线程分配arena只有三种可能的 ...

  4. 各大APP注册时发送短信验证码是怎么实现的?

    第一步:获得验证码:1.找到相关的表.2.用什么发送,post,get ,ajax,当然ajax首选3.post之前要js先判断是手机号码11位,并且全部都是数字,或者用正则也行.4.用ajax发送数 ...

  5. Flutter踩坑日记:接入现有iOS项目

    之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...

  6. [转]Magento 2.2 Developer Documentation

    本文转自:https://devdocs.magento.com/

  7. MVC应用程序显示上传的图片(续)

    上一篇<MVC应用程序显示上传的图片>http://www.cnblogs.com/insus/p/3597543.html 最后有提及没有实现用户点击图片,显示原图的功能.此篇Insus ...

  8. C# winform 无边框 窗体的拖动

    当船体设置为FormborderStyle='none' [DllImport("user32.dll")] public static extern bool ReleaseCa ...

  9. 【题解】LFYZNoip前水题赛 T6

    垃圾出题人们在30分钟内完成了讨论,出题,命题,造数据,跑std的所有环节 luv的化学竞赛题 题目背景 luv_letters 在肝化学竞赛题,他的梦想是混个省一,但是遗憾的是他今年的省二莫名消失了 ...

  10. Http升级到Https (本地测试,无须域名和认证)

    在之前的语音识别的项目中,一切都在本地进行得很顺利,然后把写的Demo部署到服务器上给老大看的时候,通过IP访问(http://192.168.145.170:8080这样的形式)时,从一开始就坏掉了 ...