Pergunta

Eu estou percebendo velocidades terríveis ao tentar usar CGLIB com um filtro de retorno (em dezenas de milhares de objetos), mas eu sou incapaz de encontrar qualquer informação sobre como otimizar CGLIB.

Para uma interface de pesquisa / list, o sistema está a carregar várias propriedades de uma consulta otimizada e preenchendo a árvore de domínio com essas propriedades. Para todas as outras propriedades, o LazyLoader está a carregar o objecto completo. A idéia é fazer com que as propriedades básicas utilizadas pela busca / list com a carga, sem perder as classes de modelo de domínio.

Exemplo básico

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()
Foi útil?

Solução

Parece que se eu configurar o CallbackFilter como uma variável de instância, em vez de uma classe interna anônima, a velocidade aumenta.

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()
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top