熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java程序性能優化-代理模式(6)

2013-11-23 20:01:39  來源: Java高級技術 

    代理模式(

  以上代碼分別生成了種代理並對生成的代理類進行高頻率的調用最後輸出各個代理類的創建耗時動態類類名和方法調用耗時結果如下

  createJdkProxy:

  JdkProxy class:$Proxy

  callJdkProxy:

  createCglibProxy:

  CglibProxy class:$javatuningchproxyIDBQuery$$EnhancerByCGLIB$$babbf

  callCglibProxy:

  createJavassistDynProxy:

  JavassistDynProxy class:javatuningchproxyIDBQuery_$$_javassist_

  callJavassistDynProxy:

  createJavassistBytecodeDynamicProxy:

  JavassistBytecodeDynamicProxy class:javatuningchproxyIDBQueryJavaassistBytecodeProxy

  callJavassistBytecodeDynamicProxy:

  可以看到JDK的動態類創建過程最快這是因為在這個內置實現中defineClass()方法被定義為native實現故性能高於其他幾種實現但在代理類的函數調用性能上JDK的動態代理就不如CGLIB和Javassist的基於動態代碼的代理而Javassist的基於代理工廠的代理實現代理的性能質量最差甚至不如JDK的實現在實際開發應用中代理類的方法調用頻率通常要遠遠高於代理類的實際生成頻率(相同類的重復生成會使用cache)故動態代理對象的方法調用性能應該作為性能的主要關注點

  注意就動態代理的方法調用性能而言CGLIB和Javassist的基於動態代碼的代理都優於JDK自帶的動態代理此外JDK的動態代理要求代理類和真實主題都實現同一個接口而CGLIB和Javassist沒有強制要求

  Hibernate中代理模式的應用

  用代理模式實現延遲加載的一個經典應用就在Hibernate框架中當Hibernate加載實體bean時並不會一次性將數據庫所有的數據都裝載默認情況下它會采取延遲加載的機制以提高系統的性能Hiberante中的延遲加載主要有兩種一是屬性的延遲加載二是關聯表的延時加載這裡以屬性的延遲加載為例簡單闡述Hibernate是如何使用動態代理的

  假定有用戶模型

  public class User implements javaioSerializable {

  private Integer id;

  private String name;

  private int age;

  //省略getter和setter

  使用以下代碼通過Hibernate加載一條User信息

  public static void main(String[] args) throws SecurityException

  NoSuchFieldException

  IllegalArgumentException

  IllegalAccessException {

  //從數據庫載入ID為的用戶

  User u=(User)HibernateSessionFactorygetSession()load(Userclass

  //打印類名稱

  Systemoutprintln(Class Name:+ugetClass()getName())

  //打印父類名稱

  Systemoutprintln(Super Class Name:+ugetClass()getSuperclass()

  getName())

  //實現的所有接口

  Class[] ins=ugetClass()getInterfaces()

  for(Class cls:ins){

  Systemoutprintln(interface:+clsgetName())

  }

  Systemoutprintln(ugetName())

  }

       返回目錄Java程序性能優化讓你的Java程序更快更穩定

  編輯推薦

       Java程序設計培訓視頻教程

       JEE高級框架實戰培訓視頻教程

       JME移動開發實戰教學視頻

  Visual C++音頻/視頻技術開發與實戰

  Oracle索引技術

  ORACLEG數據庫開發優化指南


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27829.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.