许多应用程序在压力测试阶段或在生产环境中都会遇到性能问题。若是咱们看一下性能问题背后的缘由,会发现不少是由数据处理不当形成。数据处理在应用面对大数据量时是很是关键的。这里有一些实用的数据处理技巧能够帮助更好地提高Java应用程序性能。算法
在任何Java应用程序中,方法调用要么是为调用方完成某项任务,要么是对输入数据进行处理。这两个目标都须要在调用者和处理方法之间进行数据交换。关于最小化函数传入和输出的数据量有一个经验之谈:数据越小好处越多。好比越小的数据处理就越少,须要清理的对象越少,内存的占用也更少等等。程序设计应当努力减小不一样方法、层次和应用程序之间,甚至组织之间的数据传递。经过下面将要讨论的源端数据处理能够达成这个目标。数据库
延迟数据加载是指直到实际须要最后一刻才从数据存储中获取数据。在面对重量级对象时这是很是有益的。例若有一个存储在数据库中的文件实体,文件包含blob以及与其余属性。blob大小能够从几KB到几十兆。中间层逻辑在显示文件内容以前都只依赖于其余属性。使用延迟加载能够用来处理这个blob属性。缓存
当进行远程调用时,从数据提供者反复调用取得数据会严重影响性能,好比数据库调用、Web服务调用或者其余编解码调用。这种状况下可使用Facade模式一次得到全部所需的数据,尽量减少链接成本和在网络上传输数据的成本。网络
常用但不常常变化的数据能够进行缓存,一般须要缓存的是静态或者服务端数据。现在,对应用事务数据也有很高的要求,这些数据也须要加入缓存。做为一个简单的规则,在设计应用程序时常常须要识别这类实体并缓存到合适的位置,一般这些实体不会频繁改变甚至根本不会变化。刷新对象时也能够采用这个规则。oracle
在数据源或存储位置自己进行处理是一个好习惯。将大量数据发送给客户端而后再进行处理须要传输成本,并且有时客户端的处理逻辑会改变数据格式。例如在oracle中过滤数据比较简单,只要为查询添加一个WHERE子句便可。而在Java程序中过滤这么数据须要先获取记录再逐行挨个属性进行比较。所以用Java可能不是最佳实现。框架
将数据从一种格式转换到其余格式须要转换成本。对单个值进行转换消耗的性能可能微不足道,但若是记录个数成千上万性能问题就十分明显。例如选择String数据类型的值,并把它转换为double或其余基本类型,反之亦然。ide
从性能的角度来看,这是一个很是重要的考虑因素。 Java已经提供了不一样的集合以知足不一样的需求,例若有几种原始的集合,好比ArrayList,你能够不断向ArrayList添加数据而且集合自己不会对数据进行任何操做。再好比Vector提供了同步的操做。我须要在插入数据时保持同步吗?这是一个很好的问题。若是不须要同步那么就不要使用Vector,使用ArrayList或根据要求选择他集合。函数
有时候性能问题是数据处理算法或实现逻辑形成的。实现逻辑应该将性能做为要求达到的一个目标,像是内存占用等。经过如下几个方法可使算法进一步优化:性能
优化开销很大的调用和数据库循环调用测试
优化循环里的对象声明
避免没必要要的嵌套循环
将对象存储到多个集合
咱们不能保证会当即执行垃圾收集,可是为对象设置为final或置为null是一个很好的作法。
许多技术都有助于数据处理,其中包含了上面提到的一些要点。下面是几个例子:
Oracle的prepared statement
缓存框架,例如Hibernate的一级缓存和二级缓存
Hibernate框架的延迟加载机制
在设计时须要避免性能代价太高的操做。若是没有这样的操做,还能够把数据转换减到最小。例如在Web应用程序能够尽可能减小会话的输出数据。
若是须要处理的数据量很大,那么能够并行处理不相关的数据以减小总的处理时间。
对于重量级对象不要从头建立,能够对现有对象进行克隆而且只修改必要的属性尽量重用现有的信息。经过浅拷贝和深拷贝来控制重用的数量。