Comment puis-je améliorer les performances de l'application qui utilise la JAXBContext.newInstance opération?
- Je utiliser le JAXBContext.newInstance opération dans mon JBoss application web. Cette opération, ce que je comprends, est très lourd. Je n'ai besoin que de deux instances uniques de la Marshaller classe.
Ma proposition initiale est d'avoir un initialiseur statique bloc qui va initialiser ces deux cas qu'une seule fois lors du chargement de classe:
public class MyWebApp {
private static Marshaller requestMarshaller;
private static Marshaller responseMarshaller;
static {
try {
//one time instance creation
requestMarshaller = JAXBContext.newInstance(Request.class).createMarshaller();
responseMarshaller = JAXBContext.newInstance(Response.class).createMarshaller();
} catch (JAXBException e) {
e.printStackTrace();
}
}
private void doSomething() {
requestMarshaller.marshall(...);
responseMarshaller.marshall(...);
...
}
}
Si c'est une solution raisonnable alors je crois que je vais avoir répondu à ma propre question, mais je voudrais savoir si c'est la bonne façon de le faire?
OriginalL'auteur ryan | 2011-05-18
Vous devez vous connecter pour publier un commentaire.
Un JAXB de mise en œuvre (Métro, EclipseLink MOXy, Apache JaxMe, etc) généralement initialise ses métadonnées lors de la
JAXBContext.newInstance
appel. Tous les OXM outils est nécessaire d'initialiser le mappage des métadonnées à un certain point et d'essayer de minimiser le coût de cette opération. Puisqu'il est impossible de le faire à coût nul, il est préférable de ne le faire une fois. Les Instances de JAXBContext sont thread-safe, donc oui, vous avez seulement besoin de créer une fois.De la JAXB 2.2 Spécification, la Section 4.2 JAXB Contexte:
Instances de Marshaller et Unmarshaller ne sont pas thread-safe et ne doivent pas être partagées entre les threads, ils sont légers pour créer.
OriginalL'auteur Blaise Doughan
JAXBContext doit toujours être statique, il est thread-safe.
Marshallers et Unmarshallers sont pas cher et ne pas thread-safe. Vous devez créer une fois JAXBContext et de créer marshallers/unmarshallers pour chaque opération
Utiliser les mêmes marshaller à marshall tout (ajouter toutes les classes lorsque vous créez le contexte).
Je pense que la solution proposée ici est sur place, et très utile, mais je ne crois pas que le code de l'exemple est d'illustrer la remarque faite dans le texte que vous ne devriez pas appeler JAXBContext.newInstance() à chaque fois que vous avez besoin d'un Marshaller. Ne pas le ligne en doSomething ()
requestMarshaller = jaxbContext.createMarshaller();
?OriginalL'auteur cocorossello
J'ai récemment fait quelques tests de performance avec JAXBContext.newInstance et le résultat est documentée ici .
http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html
Lorsqu'il est appelé par un fil, à l'aide d'un assez grand schéma avec ~195 classes générées, il a fallu ~400ms à la fin. Lorsqu'il est appelé par 20 threads simultanément, il a causé de cpu querelles, et a pris jusqu'à ~5000ms à la fin. La création de marshaller et l'objet de la sérialisation d'un objet de petite taille trop ~14ms.
OriginalL'auteur user1738754
On peut utiliser javax.xml.bind.JAXB. Il a direct Maréchal et unmarshal méthodes. Si vous n'avez pas à vous soucier de création de l'instance de JAXB.
par exemple, JAXB.unmarshal(inputStream/inputFile, outputClassExpected)
ou JAXB.maréchal(jaxbObject, xmlOutputFile/xmlOutputStream)
Oui. La performance peut être un sujet de préoccupation pour les projets critiques. Ceci doit être vérifié si c'est le cas. Peut-être l'écriture propre marshaller/onu-marshaller aidera.
OriginalL'auteur sandeep kale
Vous devez créer unique
JAXBContext
objet par classe d'haricot. voir cetteOriginalL'auteur Nitin Vavdiya