Ответ 1
Хорошо использовать один экземпляр для каждого приложения, если вы не вызываете какие-либо методы настройки после того, как он становится видимым, т.е. вы должны выполнить всю свою инициализацию внутри статического блока.
Я доволен тем, как ObjectMapper работает и используется в моем приложении. Что я хотел бы понять, это лучший способ реализовать ObjectMapper, чтобы обеспечить его повторное использование, и я не создаю ненужные экземпляры в своем приложении?
Мои мысли в том, что я могу объявить ObjectMapper в классе Utils следующим образом:
public class Utils {
public final static ObjectMapper mapper = new ObjectMapper();
}
Затем я мог бы ссылаться на это из разных мест, которые мне нужны для использования кода, например:
JsonSimple jsonSimple = Utils.mapper.readValue(jsonString, JsonSimple.class);
Я столкнулся с этим другим вопросом (Должен ли я объявить ObjectMapper Jackson как статическое поле?), который вызвал мой подход. Я думаю, что, возможно, главное отличие заключается в том, что я хочу разделить экземпляр ObjectMapper на разных классах, а не только на одном классе.
Соответствует ли этот подход или я что-то упускаю?
Спасибо
Хорошо использовать один экземпляр для каждого приложения, если вы не вызываете какие-либо методы настройки после того, как он становится видимым, т.е. вы должны выполнить всю свою инициализацию внутри статического блока.
Используйте последнюю версию Jackson и используйте ObjectReader
и ObjectWriter
вместо ObjectMapper
Как указано в других ответах, ObjectMapper действительно является потокобезопасным. Но повторное использование одного и того же объекта может снизить производительность вашего приложения, так как все 1 потоки могут быть заблокированы в заданное время, ожидая, когда владелец блокировки завершит сериализацию/десериализацию JSON.
Это особенно важно для веб-серверов, таких как Jetty или Tomcat: общая производительность всего сервера может быть скомпрометирована, например, если вы используете Singleton ObjectMapper в качестве точки входа/выхода служб REST - в зависимости, конечно, при загрузке вашего доступа.
Итак, мое предложение состоит в том, чтобы использовать пул ObjectMappers, чтобы позволить нескольким потокам использовать его, и таким образом вам не нужно воссоздавать карты каждый раз, когда они вам понадобятся. Число в ObjectMappers в пуле должно быть равным числу рабочих потоков вашего приложения.
Подробнее о: http://jackson-users.ning.com/forum/topics/pooling-objectmapper-for-performance
- EDIT -
Хорошо, некоторые пользователи действительно увлечены Джексоном lib до такой степени, что они понижают этот ответ, даже не глядя на связанный веб-сайт. Во всяком случае, этот ответ основан на моем опыте работы с lib без каких-либо изменений (только с использованием ObjectMapper, без дополнительных классов, без пользовательского сериализатора, без пользовательского JSONFactory, ничего) во время ответа (2013). Я больше не использую его в своих проектах, поэтому я не знаю о более новых версиях, но думаю, он должен быть разрешен к настоящему времени.
Как разработчик, если вы собираетесь прямо или косвенно использовать Джексона или любого другого читателя/писателя JSON в своем проекте, попробуйте запустить инструмент профилирования на своем сервере, чтобы увидеть, как потоки ведут себя при высокой нагрузке. Это простой шаг, который не наносит вреда.
Простой статический синглтон, предложенный вами в вашем вопросе, верен. Альтернативным подходом было бы использование шаблона singleton (использование одноэлементного шаблона подробно обсуждалось в комментариях к аналогичному вопросу). Вот простой пример:
public enum Mapper {
INSTANCE;
private final ObjectMapper mapper = new ObjectMapper();
private Mapper(){
// Perform any configuration on the ObjectMapper here.
}
public ObjectMapper getObjectMapper() {
return mapper;
}
}
Затем вы можете использовать (и повторно использовать) синглет ObjectMapper
следующим образом:
ObjectMapper mapper = Mapper.INSTANCE.getObjectMapper();
JsonSimple jsonSimple = mapper.readValue(jsonString, JsonSimple.class);
Это безопасно, поскольку ObjectMapper
поточно-безопасный после настройки.
Предостережение. Как указывает @StaxMan в комментариях к ответам, это НЕ гарантирует отсутствие дополнительной (повторной) конфигурации на возвращенном синглетоне.