为什么要使用Tomcat';s context.xml文件来声明DBCP资源?

为什么要使用Tomcat';s context.xml文件来声明DBCP资源?,tomcat,apache-commons-dbcp,context.xml,Tomcat,Apache Commons Dbcp,Context.xml,我很难理解为什么要使用context.xml文件来声明资源,在我的例子中是数据库连接池。希望在以下反对使用context.xml的论点中我已经清楚地说明了我的事实 据我所知,资源有限 在/META-INF/context.xml中声明 仅在 上下文,所以没有理由这么做 所以要共享资源 声明连接 池资源以这种方式创建 依赖于容器的 类加载器,因此如果我这样做,例如,希望 要更改我的数据库驱动程序,我需要 必须重新启动容器,而不仅仅是 我的背景 我还创建了对 像JNDI这样的集装箱运输工具 做独立测

我很难理解为什么要使用context.xml文件来声明资源,在我的例子中是数据库连接池。希望在以下反对使用context.xml的论点中我已经清楚地说明了我的事实

  • 据我所知,资源有限 在/META-INF/context.xml中声明 仅在 上下文,所以没有理由这么做 所以要共享资源

  • 声明连接 池资源以这种方式创建 依赖于容器的 类加载器,因此如果我这样做,例如,希望 要更改我的数据库驱动程序,我需要 必须重新启动容器,而不仅仅是 我的背景

  • 我还创建了对 像JNDI这样的集装箱运输工具 做独立测试的骗子

  • 最后,我必须跳过去 构建时间环以切换资源 在测试和生产之间 例如,资源

  • 所有这些问题都不是不可克服的,但从理论上讲,创建一个连接池并将其挂接到我的上下文范围似乎更为简单


    我想知道在什么情况下context.xml文件才是正确的答案?

    我看到的唯一有效原因是,如果您希望Tomcat能够使用您的连接池进行基本的用户身份验证调用,如果设置为使用JDBC UserAuth上下文,那么您可能希望Tomcat具有连接池。

    您可能希望使用
    context.xml的另一个原因是,它适用于许多事情,包括可能由Spring之类的东西管理的DBCP

    这可能优于系统属性和/或环境变量,因为您可以在单个容器中部署同一WAR的多个副本,而不必修改WAR,并且它们的配置不会重叠

    (请参阅Tomcat的文档或下面的代码片段):

    可以明确定义各个上下文元素:

    • 在应用程序文件中位于/META-INF/context.xml的单个文件中。可选(基于主机的copyXML属性) 这可以复制到$CATALINA_BASE/conf/[enginename]/[hostname]/和 重命名为应用程序的基本文件名加上“.xml”扩展名
    • 在$CATALINA_BASE/conf/[enginename]/[hostname]/目录中的单个文件(扩展名为“.xml”)中。上下文 路径和版本将从文件的基本名称( 文件名减去.xml扩展名)。此文件将始终使用 优先于web应用程序中打包的任何context.xml文件 META-INF目录
    • 在主conf/server.xml中的主机元素中
    可以定义应用于多个web站点的默认上下文元素 应用。单个web应用程序的配置将覆盖任何内容 在其中一个默认值中配置。任何嵌套元素,例如。 在默认上下文中定义的元素将 为默认应用的每个上下文创建一次。他们将 不能在上下文元素之间共享

    • 在$CATALINA_BASE/conf/context.xml文件中:所有web应用程序都将加载上下文元素信息
    • 在$CATALINA_BASE/conf/[engineame]/[hostname]/context.xml.default文件中: 上下文元素信息将由所有web应用程序加载 那主人的名字