2

我无法理解为什么要使用 context.xml 文件来声明资源,在我的例子中是数据库连接池。希望我在以下反对使用 context.xml 的论点中得到了我的事实

  1. 据我所知,/META-INF/context.xml 中声明的资源仅在上下文中可用,因此没有理由这样做来共享资源。

  2. 以这种方式声明连接池资源会创建对容器类加载器的依赖,因此如果我这样做并且例如希望更改我的数据库驱动程序,我必须重新启动容器,而不仅仅是我的上下文。

  3. 我还创建了对 JNDI 等容器事物的依赖,这使得独立测试变得更加棘手。

  4. 最后,我必须跳过构建时的障碍,例如在测试资源和生产资源之间切换资源。

这些问题都不是不可克服的,但是在纸面上创建一个连接池并将其挂接到我的上下文范围内似乎要简单得多。

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

4

2 回答 2

1

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

于 2009-06-10T18:49:21.477 回答
1

您可能想要使用 a 的另一个原因context.xml覆盖 servlet 初始化参数,然后这些参数可能用于配置任何数量的东西,包括可能由 Spring 之类的东西管理的 DBCP。

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

顺便说一句,context.xml可以生活在 WAR 之外(请参阅 Tomcat 的文档或下面的片段):

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

  • 在应用程序文件内 /META-INF/context.xml 的单个文件中。或者(基于主机的 copyXML 属性)可以将其复制到 $CATALINA_BASE/conf/[enginename]/[hostname]/ 并重命名为应用程序的基本文件名加上“.xml”扩展名。
  • 在 $CATALINA_BASE/conf/[enginename]/[hostname]/ 目录中的单个文件(带有“.xml”扩展名)中。上下文路径和版本将从文件的基本名称(文件名减去 .xml 扩展名)派生。此文件将始终优先于打包在 Web 应用程序的 META-INF 目录中的任何 context.xml 文件。
  • 在主 conf/server.xml 的 Host 元素中。

可以定义适用于多个 Web 应用程序的默认上下文元素。单个 Web 应用程序的配置将覆盖在这些默认值之一中配置的任何内容。在默认上下文中定义的任何嵌套元素,例如元素,将为每个应用默认上下文的上下文创建一次。它们不会在 Context 元素之间共享。

  • 在 $CATALINA_BASE/conf/context.xml 文件中: Context 元素信息将被所有 Web 应用程序加载。
  • 在 $CATALINA_BASE/conf/[enginename]/[hostname]/context.xml.default 文件中: Context 元素信息将由该主机的所有 Web 应用程序加载。
于 2015-05-31T17:33:04.870 回答