Низкая производительность 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()

1 ответ

Решение

Похоже, что если я устанавливаю 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()
}
Другие вопросы по тегам