如何使用共享实体管理器保留在@Transactional中

时间:2019-05-20 17:16:34

标签: spring-boot

我正在使用实体管理器来处理数据库, 最初,我以非常愚蠢的方式完成工作,这导致我遇到了非常严重的服务器问题,在连接池充满后停止获取JDBC连接。 所以我决定选择一个共享实体管理器,但是现在我被困在使用共享实体管理器时使用事务将实体持久化到数据库中。

Dao看起来像->

public List<Client> getClients()
{
List<Client> clist = new ArrayList<Client>();
entityManager =entityManagerFactory.createEntityManager();
    try
{
  clist = entityManager.createQuery("from Client").getResultList();
  return clist;
    }
catch (Exception e)
{
    }
    finally
    {
       entityManager.close()
    }
}

这会导致创建过多的连接,并且连接池已满,从而停止服务器工作。

然后我提到了- https://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/orm.html#orm-jpa 第13.5.2节

所以我改用共享实体管理器

通过编写类似-

的代码

DAO-

@PersistenceContext
private EntityManager entityManager;

public List<Client> getClients()
{
List<Client> clist = new ArrayList<Client>();
    try
    {
        clist = entityManager.createQuery("from 
Client").getResultList();
        return clist;
    }
    catch (Exception e)
    {
        LOGGER.error(e.getMessage());
        LOGGER.error(e.getStackTrace());

        return clist;
    }
}

这可以按预期工作,但是在持续出现错误时, 方法持久化实体->

    @Transactional
public void addNotification(Notifications noti)
{

    try
    {
        getEntityManager().getTransaction().begin();
        getEntityManager().persist(noti);
        getEntityManager().getTransaction().commit();

        // getEntityManager().persist(noti);
    }
    catch (Exception e)
    {
        LOGGER.error(e.getMessage());
        LOGGER.error(e.getStackTrace());
    }
    finally
    {

    }
}

但这里出现异常,不允许在共享的EntityManager上创建事务-改用Spring事务或EJB CMT

如果我在这里做错了,请纠正,并提供最佳解决方案。 预先感谢...

0 个答案:

没有答案