gpt4 book ai didi

jpa-2.0 - 实体管理器是否创建到数据库的连接?

转载 作者:行者123 更新时间:2023-12-04 05:42:26 24 4
gpt4 key购买 nike

在我的项目中,我忘记为每个操作关闭实体管理器。一段时间后,由于与 mysql 服务器的连接过多,我得到了异常。这是否意味着每个实体管理器都建立了连接?当我们忘记关闭连接时会发生什么?我只使用了一个实体管理器工厂。

最佳答案

假设您使用的是应用程序管理的实体管理器,那么您负责初始化和关闭实体管理器。另一方面,如果您依赖容器将实体管理器注入(inject) session bean(或任何托管类),则容器负责确保实体管理器已关闭。

通常,实体管理器不负责创建与数据库的连接。它会改为使用一个连接池,它在 persistence.xml 中定义。 . JTA 实体管理器和资源本地实体管理器都是如此。 JTA 实体管理器依赖于应用服务器环境提供的 JTA 数据源,而资源本地实体管理器创建和管理自己的池。

如果您不关闭实体管理器,并且继续创建它们的新实例,那么您可能会耗尽 JTA 数据源中的连接(对于 JTA 实体管理器)或达到服务器定义的客户端连接限制(对于JTA 和资源本地实体管理器)。每个数据库实例将被配置为接受不超过一定数量的连接。如果所有客户端建立的连接数超过此限制,服务器将简单地丢弃附加连接。如果您打开请求来自池的附加连接的实体管理器实例(对于 JTA 实体管理器),或创建新池(对于资源本地实体管理器),那么池本身很可能会耗尽,或者也可能耗尽许多连接将被打开。

由于您无法直接关闭连接,甚至无法从应用程序调整连接池的大小,因此很明显,您必须在不再需要实体管理器实例时关闭它们;这将自动释放为实体管理器建立的连接。

此外,明智的做法是为每个实体管理器实例使用经过良好调整且大小适当的连接池,以防您出于某种原因使用资源本地实体管理器。如果您使用的是 JTA 实体管理器,请考虑使用容器注入(inject)的实体管理器和由经过良好调整和足够大小的连接池支持的 JTA 数据源。

关于jpa-2.0 - 实体管理器是否创建到数据库的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6815277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com