Медленная производительность CGLIB с использованием фильтров обратного вызова

StackOverflow https://stackoverflow.com/questions/2043814

  •  20-09-2019
  •  | 
  •  

Вопрос

Я замечаю ужасную скорость при попытке использовать 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()
Это было полезно?

Решение

Похоже, что если я настрою 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()
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top