问题描述
我有以下创建 EntityManagerFactory 的单例类:-
public class PL4BaseDAO {
private final static Logger logger = LoggerFactory.getLogger(PL4BaseDAO.class);
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("pl4sms-persistence");
public static EntityManager getEm() {
logger.info(emf.toString());
return emf.createEntityManager();
}
public static void closeEntityManagerFactory() {
emf.close();
}
}
现在上面的类扩展了许多类,例如:-
@Stateless
public class BillingHistoryDao extends PL4BaseDAO implements Serializable,BillingHistoryInterface {
// EntityManager em = null;
private final static Logger logger = LoggerFactory.getLogger(BillingHistoryDao.class);
public void addbillingHistory(BillingHistory billingHistory) {
EntityManager em = getEm();
logger.info(em.toString());
try {
em.getTransaction().begin();
em.persist(billingHistory);
em.getTransaction().commit();
} catch (Exception exception) {
if (em.getTransaction().isActive())
em.getTransaction().rollback();
// LOG.error(exception.getMessage());
} finally {
em.close();
}
}
}
以上类添加打包成jar,部署在wildfly服务器上。这些 DAO 层类由使用 JNDI 查找的其他类使用。
现在我在每次交易后关闭 EntityManager,但没有关闭 EntityManagerFactory 的机制。
当我从服务器取消部署 war 文件和上述 jar 文件时,现有的连接被放弃并建立新的连接,在这种重新部署的几个周期后,postgres 耗尽了连接。
我发现了以下关闭 EntityManagerFactory 的答案,如果它在 Web 应用程序中,我可以像下面的代码一样在销毁上下文时关闭它
@WebListener
public class EMF implements servletcontextlistener {
private static EntityManagerFactory emf;
@Override
public void contextinitialized(ServletContextEvent event) {
emf = Persistence.createEntityManagerFactory("unitname");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
emf.close();
}
public static EntityManager createEntityManager() {
if (emf == null) {
throw new IllegalStateException("Context is not initialized yet.");
}
return emf.createEntityManager();
}
}
但是我的 EntityManagerFactory 位于一个 jar 中。取消部署 jar 时,如何关闭 EntityManagerFactory?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)