Jakarta ee 如何在JavaEE中动态加载连接池

Jakarta ee 如何在JavaEE中动态加载连接池,jakarta-ee,connection-pooling,application-server,Jakarta Ee,Connection Pooling,Application Server,我正在用JavaEE框架构建一个web应用程序。我正在寻找如何通过配置文件(如属性文件或xml文件或其他文件)将连接池动态加载到数据库 我正在寻找这种方式,因为我的web应用程序需要一个池连接,但我事先不知道哪个应用程序的服务器将用于启动我的web应用程序。这就是为什么我需要找到一种为所有类型的JavaEE服务器加载连接池的标准方法 我不知道这有没有可能。。但是如果你能帮我的话,这对我的项目将是非常好的 提前感谢。所有JavaEE服务器实现(甚至Tomcat)都提供了一种配置一个或多个数据库连接

我正在用JavaEE框架构建一个web应用程序。我正在寻找如何通过配置文件(如属性文件或xml文件或其他文件)将连接池动态加载到数据库

我正在寻找这种方式,因为我的web应用程序需要一个池连接,但我事先不知道哪个应用程序的服务器将用于启动我的web应用程序。这就是为什么我需要找到一种为所有类型的JavaEE服务器加载连接池的标准方法

我不知道这有没有可能。。但是如果你能帮我的话,这对我的项目将是非常好的


提前感谢。

所有JavaEE服务器实现(甚至Tomcat)都提供了一种配置一个或多个数据库连接池的方法,这样您就不必在应用程序级别担心它了

通过注入
javax.sql.DataSource
,可以访问数据库连接:

 @Resource
 private DataSource ds;

 void someMethod() {
     try(Connection conn = ds.getConnection()) {
         Statement st = conn.createStatement();
         // etc
     } 
 }
或者通过执行JNDI查找:

 void someMethod() {
     try(Context context = new InitialContext();
         DataSource ds = (DataSource)context.lookup("some/name/configured/in/the/server");
         Connection conn = ds.getConnection()) {

         Statement st = conn.createStatement();
         // etc
     } 
 }

现代JavaEE实现也为“some/name/configured/in/the/server”提供了一种使用标准名称的方法。如果您在较旧的平台上,则需要使用依赖于平台的部署描述符将配置的数据源名称映射到应用程序中使用的硬连接名称-但这是另一个主题。

标准方法是上面描述的@BalusC。连接池的配置是一个“ops”问题,而不是应用程序的问题。这是因为像JDBC连接这样的资源,虽然可能只与一个应用程序相关,但从内存和稳定性的角度来看,可能会影响整个应用程序服务器。由应用服务器提供一个已知良好的实现,然后将责任放在每个应用程序上,以使其正确,这样更有效。它还迫使负责服务器的人员了解这些资源。应用程序应该只执行查找。也就是说,具体步骤取决于应用程序服务器,因此如果您需要详细信息,请让我们知道您正在使用哪个应用程序服务器

如果您使用的是JavaEE(5+)API,执行此查找的标准方法是使用
@PersistenceContext
,它将插入一个实体管理器,该实体管理器在与应用程序捆绑的persistence.xml文件中配置。通过JNDI公开的连接池与命名持久性上下文之间的映射在此文件中执行。可以在这里找到一些文档


通常我们要做的是使用应用服务器的管理API(RESTful或cmd行)编写一个脚本,以提供此属性和其他属性(如最大内存等)。开发者可以运行这个脚本。另一个选项是将配置的应用程序服务器作为docker容器分发。然后,每个开发人员只需旋转这个容器并将应用程序部署到其中。这种方法有几个优点,即它可以以一致的方式模拟整个生产环境

你为什么这么担心?只需让webapp所有者担心相应地配置服务器即可。只需让您的Web应用程序询问该池的JNDI名称即可使用。谢谢您的回答。事实上,我需要这个特性,因为不管我们是否有50名开发人员在这个项目上工作,我们每个人都有一个不同的JavaEE服务器,我都会很容易地复制相同的运行时环境,而不让服务器所有者在服务器上做一些更改。可能吗?如果我可以通过java类(例如池连接)加载JNDI系统,那么JNDI系统就是INTESREST,但我不确定这是否可行。。