数据库连接用完

问题描述

我有以下创建 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...