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