2013-03-15 1 views
1

Просто интересно, если иметь статический бульдозерный картограф, как это может приводит к ошибкам параллелизма:Статического использование бульдозер Mapper

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; 
} 

используется метод в сессионном компоненте @Stateless сервера JBoss он может быть доступен одновременно. Дело в том, что я действительно не знаю, использует ли Dozer статические переменные или переменные экземпляра в библиотеке, чтобы решить, могу ли я/использовать статический Mapper или создавать новый экземпляр при каждом вызове.

ответ

2

Экземпляр бульдозера может быть статическим. Если вы создадите новый экземпляр для каждого запроса, производительность будет намного хуже, так как много кешей будет инициализироваться каждый раз. ConcurrencyErrors могут возникать либо из-за ошибок в пользовательских конвертерах, либо из-за внутренних проблем с Dozer.

+0

В настоящее время я не использую пользовательские преобразователи. Следовательно, я должен быть в безопасности. Я изменю свой код для статического экземпляра. – Wis

0

С documentation экземпляр DozerMapper должен быть построен как одноэлементный. DozerBeanMapper является потокобезопасным, поэтому вы можете использовать любые риски с несколькими потоками.

Кроме того, вы можете использовать DozerBeanMapperSingletonWrapper.getInstance(); Это будет обрабатывать синглтонную часть для вас.

Я не думаю, что это действительно хорошая идея использовать картограф как общедоступное статическое поле.

Вы также можете использовать Selma, чтобы обрабатывать вас. Это новая библиотека, основанная на процессоре Annotation, который генерирует код сопоставления во время компиляции. С его помощью код будет выглядеть так:

// 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);