2013-03-15 160 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);