使用`hibernate.ejb.use_class_enhancer`进行Hibernate刷新优化

时间:2014-06-10 17:57:38

标签: spring hibernate

我正在尝试使用hibernate功能来增强刷新性能而不需要更改代码。我遇到了选项 hibernate.ejb.use_class_enhancer 我做了以下更改。

1)启用属性hibernate.ejb.use_class_enhancer为true 构建失败并出现错误'如果未指定LoadTimeWeaver,则无法应用类转换器'

2)我补充说      context:load-time-weaver 到上下文文件 构建失败,出现以下错误: 指定自定义LoadTimeWeaver或使用Spring的代理启动Java虚拟机:-javaagent:spring-agent.jar

3)我将以下内容添加到maven-surefire-plugin中     的 javaagent:$ {settings.localRepository} /组织/ springframework的/弹簧     剂/ 2.5.6.SEC03 /弹簧剂2.5.6.SEC03.jar

现在构建成功。

我们有一个拦截器,用于跟踪事务中刷新的实体数量 在我做了上述更改之后,我预计这个数字会显着下降,但是,他们没有。

我的问题是:

  1. 以上更改是否正确/足以获得'实体刷新优化'?
  2. 如何验证应用程序确实在使用优化?
  3. 修改

    调试后,我发现了以下内容 有一段时间我们的DO类被提交进行转换,但是,确定给定类是否应该被转换的逻辑不能正确处理类名(在我的例子中),因此,DO类去了没有被改造。 有没有办法可以通过我的逻辑呢?

    相关代码如下 对于以下输入,return copyEntities.contains( className );出现错误 copyEntities包含字符串"com.x.y.abcDO", "com.x.y.asxDO"的列表,其中className为"com.x.y.abcDO_$$_jvsteb8_48"

    public InterceptFieldClassFileTransformer(List<String> entities) {
            final List<String> copyEntities = new ArrayList<String>( entities.size() );
            copyEntities.addAll( entities );
            classTransformer = Environment.getBytecodeProvider().getTransformer(
                    //TODO change it to a static class to make it faster?
                    new ClassFilter() {
                        public boolean shouldInstrumentClass(String clas    sName) {
                            return copyEntities.contains( className );
                        }
                    },
                    //TODO change it to a static class to make it faster?
                    new FieldFilter() {
                        @Override
                        public boolean shouldInstrumentField(String clas    sName, String fieldName) {
                            return true;
                        }
                        @Override
                        public boolean shouldTransformFieldAccess(
                            String transformingClassName, String fieldOwnerClassName, String fieldName
                    ) {
                        return true;
                    }
                }
        );
    }
    

    于6月15日编辑

    我更新了我的项目,使用Spring 4.0.5.RELEASE和hibernate到4.3.5.Final
    我开始使用org.hibernate.jpa.HibernatePersistenceProvider

    org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver

    hibernate.ejb.use_class_enhancer=true

    通过这些更改,我正在调试刷新行为。我在这个代码块中有一个问题。

    private boolean isUnequivocallyNonDirty(Object entity) {
    
        if(entity instanceof SelfDirtinessTracker)
            return ((SelfDirtinessTracker) entity).$$_hibernate_hasDirtyAttributes();
    
        final CustomEntityDirtinessStrategy customEntityDirtinessStrategy =
                persistenceContext.getSession().getFactory().getCustomEntityDirtinessStrategy();
        if ( customEntityDirtinessStrategy.canDirtyCheck( entity, getPersister(), (Session) persistenceContext.getSession() ) ) {
            return ! customEntityDirtinessStrategy.isDirty( entity, getPersister(), (Session) persistenceContext.getSession() );
        }
    
        if ( getPersister().hasMutableProperties() ) {
            return false;
        }
    
        if ( getPersister().getInstrumentationMetadata().isInstrumented() ) {
            // the entity must be instrumented (otherwise we cant check dirty flag) and the dirty flag is false
            return ! getPersister().getInstrumentationMetadata().extractInterceptor( entity ).isDirty();
        }
    
        return false;
    }
    

    在我的情况下,由于persister saying yes for hasMutableProperties,流程返回false。我认为拦截器根本没有机会回答 是不是字节码转换器在这里导致拦截器?或者字节码转换应该使实体成为SelfDirtinessTracker

    任何人都可以解释一下,我在这里应该从字节码转换中得到什么样的行为。

0 个答案:

没有答案