2010-01-11 17 views
1

Je remarque des vitesses terribles lorsque j'essaie d'utiliser CGLIB avec un filtre de rappel (sur des dizaines de milliers d'objets) mais je ne trouve aucune information sur l'optimisation de CGLIB.Lenteur des performances CGLIB à l'aide des filtres de rappel

Pour une interface de recherche/liste, le système charge plusieurs propriétés à partir d'une requête optimisée et remplit l'arborescence du domaine avec ces propriétés. Pour toutes les autres propriétés, le LazyLoader charge l'objet complet. L'idée est d'avoir les propriétés de base utilisées par la recherche/liste à charger, tout en ne perdant pas les classes du modèle de domaine.

de base Exemple

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() 

Répondre

0

Il semble que si je mets la CallbackFilter comme une variable d'instance au lieu d'une classe interne anonyme, la vitesse augmente.

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() 
}