2013-03-15 90 views
1

只是想知道如果有一个静态的推土机映射这样才能导致并发性错误:静态使用推土机映射的

public static Mapper mapper = new DozerBeanMapper(); 
public static MyDTO toDTO(MyEntity e) { 
    MyDTO dto = mapper.map(e, MyDTO.class); 
    return dto; 
} 

或者我应该始终使用此代码:

public static MyDTO toDTO(MyEntity e) { 
    Mapper mapper = new DozerBeanMapper(); 
    MyDTO dto = mapper.map(e, MyDTO.class); 
    return dto; 
} 

使用方法在JBoss服务器的@Stateless会话bean中,可以同时访问它。事实是我真的不知道Dozer是否利用库中的静态变量或实例变量来决定我是否可以/应该使用静态Mapper或在每次调用时创建一个新实例。

回答

2

推土机实例可能是静态的。如果您要为每个请求创建新实例,性能会更差,因为每次都会初始化大量高速缓存。由于自定义转换器中的错误或内部Dozer问题,可能会遇到并发错误。

+0

我目前不使用自定义转换器。因此,我应该安全。我将更改我的代码以获取静态实例。 – Wis 2013-03-26 08:07:22

0

documentation DozerMapper实例应该建立为单身。 DozerBeanMapper是线程安全的,因此您可以使用多线程的任何风险。

为了确保您还可以使用DozerBeanMapperSingletonWrapper.getInstance();这将为您处理单件部分。

我不认为使用mapper作为公共静态字段是一个非常好的主意。

你也可以使用Selma来处理你的映射。这是一个基于Annotation处理器的新库,它在编译时生成映射代码。随着它youre代码将如下所示:

// Configure the mapping 
@Mapper 
public interface DtoMapper { 

    MyDTO toDTO(MyEntity e); 
} 

// Retrieve the mapper 
public static DtoMapper mapper = Selma.getMapper(DtoMapper.class); 

// and some where in the code use 
mapper.toDto(entity);