2010-09-09 75 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()); 
    } 
} 

当这个类从异步EJB调用被调用时,会泄漏内存吗?CreateEntityManagerFactory的大小正在增加。它泄漏内存吗?

所以我想到了制作EntityManager和EntityManagerFactory静态类成员。这会解决问题吗?

这里需要一些帮助。当我运行JProfiler时。它说这个区域是一个热点。尤其是createEntityManagerFactory。

任何帮助解决此泄漏表示赞赏。

回答

1

我不认为你关闭了EMF或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()); 
} 

您不应该将实体管理器放在字段中。这是一种“使用一次,然后扔掉”的物体。但是,您可以保留EMF参考。

您多久创建一次SoapMessageProcessor实例?

您是否在使用任何种类的依赖注入框架?它会让你的生活变得更简单。

+1

SOAPMessageProcessor被调用为来自Jboss扩展的异步调用。所以当用户提出请求时。为了记录目的,SOAP消息处理器正在被调用。 Jboss扩展创建并发线程来访问消息处理器。 – 2010-09-10 16:32:34

+0

@Vanchinathan:好的,听起来你只有一个'SoapMessageProcessor'实例。在这种情况下,在类的'create()'方法中创建EMF,并在'destroy()'方法中'关闭()'EMF。在您的日志记录方法中创建(并且不要忘记关闭!)EM。创建和关闭一个EM是一个便宜的操作,所以你应该没问题。 – 2010-09-10 16:57:44

+0

嗨,我宣布EMF为静态并在静态块中初始化它。所以只要班级生活就可以使用。出于某种原因,代码没有生命周期方法。所以我遵循了这个方法。 – 2010-09-10 20:39:18