Медленная производительность CGLIB с использованием фильтров обратного вызова
-
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()
}
Не связан с StackOverflow