许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题。如果我们看一下性能问题背后的原因,会发现很多是由数据处理不当造成。数据处理在应用面对大数据量时是非常关键的。这里有一些实用的数据处理技巧可以帮助更好地提升Java应用程序性能。

减少数据传输

在任何Java应用程序中,方法调用要么是为调用方完成某项任务,要么是对输入数据进行处理。这两个目标都需要在调用者和处理方法之间进行数据交换。关于最小化函数传入和输出的数据量有一个经验之谈:数据越小好处越多。比如越小的数据处理就越少,需要清理的对象越少,内存的占用也更少等等。程序设计应当努力减少不同方法、层次和应用程序之间,甚至组织之间的数据传递。通过下面将要讨论的源端数据处理可以达成这个目标。

延迟加载

延迟数据加载是指直到实际需要最后一刻才从数据存储中获取数据。在面对重量级对象时这是非常有益的。例如有一个存储在数据库中的文件实体,文件包含blob以及与其他属性。blob大小可以从几KB到几十兆。中间层逻辑在显示文件内容之前都只依赖于其他属性。使用延迟加载可以用来处理这个blob属性。

不断重复数据调用

当进行远程调用时,从数据提供者反复调用取得数据会严重影响性能,比如数据库调用、Web服务调用或者其他编解码调用。这种情况下可以使用Facade模式一次获得所有所需的数据,尽可能减小连接成本和在网络上传输数据的成本。

高速缓冲

经常使用但不经常变化的数据可以进行缓存,通常需要缓存的是静态或者服务端数据。如今,对应用事务数据也有很高的要求,这些数据也需要加入缓存。作为一个简单的规则,在设计应用程序时经常需要识别这类实体并缓存到合适的位置,通常这些实体不会频繁改变甚至根本不会变化。刷新对象时也可以采用这个规则。

在源端处理数据

在数据源或存储位置本身进行处理是一个好习惯。将大量数据发送给客户端然后再进行处理需要传输成本,而且有时客户端的处理逻辑会改变数据格式。例如在oracle中过滤数据比较简单,只要为查询添加一个WHERE子句即可。而在Java程序中过滤这么数据需要先获取记录再逐行挨个属性进行比较。因此用Java可能不是最佳实现。

尽可能减少数据转换和避免不正确的数据类型

将数据从一种格式转换到其他格式需要转换成本。对单个值进行转换消耗的性能可能微不足道,但如果记录个数成千上万性能问题就十分明显。例如选择String数据类型的值,并把它转换为double或其他基本类型,反之亦然。

保持数据的正确采集

从性能的角度来看,这是一个非常重要的考虑因素。 Java已经提供了不同的集合以满足不同的需求,例如有几种原始的集合,比如ArrayList,你可以不断向ArrayList添加数据并且集合本身不会对数据进行任何操作。再比如Vector提供了同步的操作。我需要在插入数据时保持同步吗?这是一个很好的问题。如果不需要同步那么就不要使用Vector,使用ArrayList或根据要求选择他集合。

对数据处理算法进一步优化

有时候性能问题是数据处理算法或实现逻辑造成的。实现逻辑应该将性能作为要求达到的一个目标,像是内存占用等。通过以下几个方法可以使算法进一步优化:

  • 优化开销很大的调用和数据库循环调用
  • 优化循环里的对象声明
  • 避免不必要的嵌套循环
  • 将对象存储到多个集合

Finalize重型数据对象

我们不能保证会立即执行垃圾收集,但是为对象设置为final或置为null是一个很好的做法。

利用技术特点优化数据处理

许多技术都有助于数据处理,其中包含了上面提到的一些要点。下面是几个例子:

  • Oracle的prepared statement
  • 缓存框架,例如Hibernate的一级缓存和二级缓存
  • Hibernate框架的延迟加载机制

数据序列化和反序列化

在设计时需要避免性能代价过高的操作。如果没有这样的操作,还可以把数据转换减到最小。例如在Web应用程序可以尽量减少会话的输出数据。

并行处理数据

如果需要处理的数据量很大,那么可以并行处理不相关的数据以减少总的处理时间。

对象重用

对于重量级对象不要从头创建,可以对现有对象进行克隆并且只修改必要的属性尽可能重用现有的信息。通过浅拷贝和深拷贝来控制重用的数量。

本文转自:http://www.importnew.com/5674.html

提升你的Java应用性能:改善数据处理的更多相关文章

  1. 【转】提升你的Java应用性能:改善数据处理

    提升你的Java应用性能:改善数据处理 作者:贾小骏  发布于07月26日 10:17 许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题.如果我们看一下性能问题背后的原因,会发现很多是由数据处 ...

  2. Ehcache的视频-如何用Ehcache提升你的Java应用性能

    Java应用最广的缓存(分布式缓存)Ehcache的Youtube介绍视频 (需-翻-墙)

  3. 影响Java EE性能的十大问题(转)

    本文作者是一名有10多年经验的高级系统架构师,他的主要专业领域是Java EE.中间件和JVM技术.他在性能优化和提升方面也有很深刻的见解,下面他将和大家分享一下常见的10个影响Java EE性能问题 ...

  4. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  5. Java的性能优化

    http://www.toutiao.com/i6368345864624144897/?tt_from=mobile_qq&utm_campaign=client_share&app ...

  6. Java 应用性能调优实践

    Java 应用性能优化是一个老生常谈的话题,笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层.通过介绍 Java 性能诊断工具和思路,给出搜狗商业平台的性 ...

  7. [JAVA] java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  8. Java日志性能

    在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索.绝大多数人都认可日志的重要性,但是又有多少人仔细想过该怎么打日志,日志对性能的影响究竟有多大呢?今天 ...

  9. Java GC 专家系列5:Java应用性能优化的原则

    本文是GC专家系列中的第五篇.在第一篇理解Java垃圾回收中我们学习了几种不同的GC算法的处理过程,GC的工作方式,新生代与老年代的区别.所以,你应该已经了解了JDK 7中的5种GC类型,以及每种GC ...

随机推荐

  1. YYKit之YYText

    原文:http://www.cnblogs.com/lujianwenance/p/5716804.html   本文的目的是希望能帮助到我们更快的熟悉和学习YYText的结构和实现的思路,如有不正确 ...

  2. iOS10---新特性以及适配点(转)

    iOS 10 新特性以及适配点 SiriKit 所有第三方应用都可以用Siri,支持音频.视频.消息发送接收.搜索照片.预订行程.管理锻炼等 Proactive Suggestions 系统预先建议 ...

  3. react native android 开发,基础配置笔记。

    一.React-native-device-info https://github.com/rebeccahughes/react-native-device-info 二.修改App名称 三.定位权 ...

  4. ServiceStack.Redis 破解

    在github上下载了ServiceStack.Redis,做测试发现有限制,居然从v4开始就收费,无聊时,做了个源码分析 废话不多,上测试代码 try { ; i < ; i++) { red ...

  5. HDU 3442 Three Kingdoms(状态压缩 + BFS )

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3442 题目大意:三国时期,刘备逃亡.给定一个最大为50*50的地图,刘备在地图中只能往4个方向走. 地 ...

  6. MySQL的环境变量

    MySQL的环境变量 服务器变量:调整MySQL的工作属性,由MySQL的配置文件决定 状态变量:MySQL运行以后所输出的自身统计信息 在Linux下查看MySQL的环境变量 1.获取MySQL客户 ...

  7. apache的MPM机制-prefork

    apache是基于模块化设计的. 关于基础的服务,也采用了模块化的设计,但是这个模块是具有排他性的,同一时间只能有一个得到调用. MPM模块(multi processing module) 多处理模 ...

  8. linux centos cli all proxy

    linux centos 下代理http.https.ftp.all_proxy 全局使用代理: export http_proxy=http://host:port/ export https_pr ...

  9. Python httpsqs封装类

    ''' httpsqs队列封装 @author xp_go@qq.com a = HttpsqsClient('192.168.0.218','1218','httpsqsmmall.com') pr ...

  10. 在Django中使用Mako模板

    用了一个月后,终于忍受不了Django的模板了.主要原因是模板内不能运行原生的python语句,所以用起来总感觉被人绑住手脚,遍历个字典都要搞半天. 所以决定用第三方的模板.查了一下,django用的 ...