Sollte ich Jacksons ObjectMapper als statisches Feld deklarieren?
Die Jackson-Bibliothek ObjectMapper
Klasse scheint zu sein, thread safe.
Bedeutet dies, dass, sollte ich erklären, meine ObjectMapper
als ein statisches Feld wie dieses
class Me {
private static final ObjectMapper mapper = new ObjectMapper();
}
statt als Instanz-level-Bereich?
class Me {
private final ObjectMapper mapper = new ObjectMapper();
}
InformationsquelleAutor der Frage Cheok Yan Cheng | 2010-10-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, das ist sicher und zu empfehlen.
Dem einzigen VORBEHALT, von der Seite, die Sie bezeichnet ist, dass Sie können nicht ändern die Konfiguration der mapper, sobald es geteilt wird; aber Sie sind nicht zu ändern-Konfiguration so in Ordnung ist. Wenn Sie haben müssen zu Konfiguration ändern möchten, führen Sie aus, dass der static-block, und es wäre auch gut.
BEARBEITEN: (2013/10)
Mit 2,0 und oben, oben kann ergänzt werden mit der Feststellung, dass es eine noch bessere Möglichkeit: verwenden Sie
ObjectWriter
undObjectReader
Objekte, die erstellt werden können, durchObjectMapper
.Sie sind völlig unveränderlich, thread-sicher, D. H., dass es nicht einmal theoretisch möglich, dass der thread-Fragen der Sicherheit (die auftreten können, mit
ObjectMapper
wenn code versucht, re-configure instance).InformationsquelleAutor der Antwort StaxMan
Obwohl ObjectMapper threadsicher ist, würde ich dringend raten davon ab, die Deklaration als eine statische variable, vor allem in Multi-Threaded-Anwendung.
Nicht einmal, weil es ist eine schlechte Praxis, sondern weil Sie eine schwere Gefahr von Deadlocks. Ich sage es aus meiner eigenen Erfahrung. Ich habe eine Anwendung mit 4 identischen threads, die immer waren, und die Verarbeitung der JSON-Daten von web-services.
Mein Antrag wurde Häufig stocken Sie auf den folgenden Befehl, gemäß dem thread-dump:
Neben,, die Leistung war nicht gut.
Wenn ich durch statische variable mit der Instanz-basierte variable, Abwürgen verschwunden und die Leistung vervierfacht. I. e. 2.4 Millionen JSON-Dokumente wurden verarbeitet in 40min.56sec., statt 2,5 Stunden vorher.
InformationsquelleAutor der Antwort Gary Greenberg
Obwohl es sicher ist, deklarieren Sie eine statische ObjectMapper in Bezug auf die thread-Sicherheit, sollten Sie sich bewusst sein, dass die Konstruktion statische Objekt-Variablen in Java gilt als schlechte Praxis. Für mehr details, siehe Warum sind statische Variablen, die als böse? (und wenn Sie möchten, meine Antwort)
Kurz, Statik vermieden werden sollte, weil die es schwierig machen, zu schreiben, prägnant unit-tests. Zum Beispiel mit einem static final ObjectMapper, Sie können nicht die swap-JSON-Serialisierung für dummy-code oder ein no-op.
In addition, a static final verhindert, dass Sie jemals Neukonfiguration ObjectMapper zur Laufzeit. Sie könnte sich nicht vorstellen, einen Grund für das jetzt, aber wenn Sie sperren sich in einen static final pattern, nichts weniger als das abreißen der classloader lassen Sie re-initialisieren.
Im Falle der ObjectMapper seine feine, aber im Allgemeinen ist es schlechte Praxis, und es besteht kein Vorteil gegenüber der Verwendung einer singleton-Muster oder inversion-of-control-verwalten Sie Ihre langlebige Objekte.
InformationsquelleAutor der Antwort JBCP
com.fasterxml.jackson.databind-Methode.Typ.TypeFactory._hashMapSuperInterfaceChain(HierarchicType)
Die Methode _hashMapSuperInterfaceChain in der Klasse com.fasterxml.jackson.databind-Methode.Typ.TypeFactory synchronisiert ist.
Bin sehen Konflikte auf der gleichen bei hohen Belastungen.
Kann ein weiterer Grund sein, um zu vermeiden eine statische ObjectMapper
InformationsquelleAutor der Antwort Harshit