콜백 필터를 사용한 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()
해결책
익명의 내부 클래스 대신 인스턴스 변수로 콜백 필터를 설정하면 속도가 증가하는 것으로 보입니다.
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