2010-09-09 4 views
0
public class SoapMessageProcessor { 

private EntityManager em; 
private static final Logger logger = Logger.getLogger(SoapMessageProcessor.class); 

public SoapMessageProcessor() { 
    try { 
     EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("Auditing"); 
     em = emFactory.createEntityManager(); 
    } catch (Exception ex) { 
     throw new RuntimeException(ex.getMessage()); 
    } 
} 

Est-ce que cette mémoire de fuite, lorsque cette classe est appelée à partir d'un appel EJB asynchrone? J'ai donc pensé à créer les membres de classe statiques EntityManager et EntityManagerFactory. Cela résoudra-t-il le problème?CreateEntityManagerFactory prend de l'ampleur. Est-ce que la mémoire fuit?

Vous avez besoin d'aide ici. Quand j'ai couru JProfiler. Il dit que cette zone est un point chaud.Surtout la createEntityManagerFactory.

Toute aide pour la réparation de cette fuite est appréciée.

Répondre

1

Je ne pense pas que vous fermiez le EMF ou le EM.

try { 
     EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("Auditing"); 
     em = emFactory.createEntityManager(); 
     // do whatever you need to do 
     em.close(); 
     emFactory.close(); 
} catch (Exception ex) { 
     throw new RuntimeException(ex.getMessage()); 
} 

Vous ne devez pas conserver un gestionnaire d'entités dans un champ. C'est une sorte d'objet "utiliser une fois puis jeter". Vous pouvez cependant conserver une référence EMF.

À quelle fréquence créez-vous des instances SoapMessageProcessor? Utilisez-vous un cadre d'injection de dépendance quelconque? Cela rendra votre vie beaucoup plus simple.

+1

Le SOAPMessageProcessor est appelé en tant qu'appel asynchrone à partir d'extensions Jboss. Donc, quand jamais l'utilisateur fait une demande. Le processeur de message SOAP est appelé pour la consignation. L'extension Jboss crée des threads concurrents pour accéder au processeur de messages. –

+0

@Vanchinathan: OK, il semblerait que vous n'ayez qu'une seule instance de 'SoapMessageProcessor'. Dans ce cas, créez votre EMF dans la méthode 'create()' de la classe, et 'close()' votre EMF dans la méthode 'destroy()'. Créez (et n'oubliez pas de fermer!) Un EM dans votre méthode de journalisation. Créer et fermer un EM est une opération bon marché, alors ça devrait aller. –

+0

Salut, j'ai déclaré l'EMF statique et l'initialisé dans le bloc statique. Donc, il sera disponible aussi longtemps que la classe vit. Pour une raison quelconque, le code n'a pas de méthodes de cycle de vie. J'ai donc suivi cette approche. –

Questions connexes