2010-01-11 38 views
1

當我嘗試使用CGLIB和回調過濾器(數以萬計的對象)時,我注意到可怕的速度,但我無法找到任何有關優化CGLIB的信息。使用回調過濾器緩慢CGLIB性能

對於搜索/列表界面,系統正在從優化查詢中加載多個屬性,並使用這些屬性填充域樹。對於所有其他屬性,LazyLoader正在加載完整對象。這個想法是讓搜索/列表使用的基本屬性加載,而不會丟失域模型類。

基本實施例

String name = rst.getString(1); 

Enhancer enhancer = new Enchancer(); 
enhancer.setSuperclass(Type.class); 
enhancer.setCallbackFilter(new CallbackFilter(){ 
    public int method(Method method){ 
     if("getName".equals(method.getName()){ 
      return 1; 
     } 
     return 0; 
    } 
}); 
enhancer.setCallbacks(new Callback[]{ 
    new LazyLoader(){...} 
    new FixedValueImpl(name); 
}); 
return (Type)enhancer.create() 

回答

0

看來,如果我設置的CallbackFilter作爲一個實例變量,而不是一個匿名內部類,速度增加。

private CallbackFilter callbackFilter = new CallbackFilter(){...}; 

... 

private Type createType(ResultSet rst){ 
    String name = rst.getString(1); 

    Enhancer enhancer = new Enchancer(); 
    enhancer.setSuperclass(Type.class); 
    enhancer.setCallbackFilter(this.callbackFilter); 
    enhancer.setCallbacks(new Callback[]{ 
     new LazyLoader(){...} 
     new FixedValueImpl(name); 
    }); 
    return (Type)enhancer.create() 
}