【问题标题】:What config do I have to change for multiple Tomcat instances to use separate context.xml files?我必须更改哪些配置才能让多个 Tomcat 实例使用单独的 context.xml 文件?
【发布时间】:2014-01-12 01:49:25
【问题描述】:

我在同一台 Windows 机器上设置了两个运行在不同端口上的 tomcat 实例。一个用于 Alpha,另一个用于开发。我已经将 Alpha 和 Dev 战争(相同的应用程序名称,META-INF/context.xml 中的不同设置)部署到每个服务器。

Tomcat 目录具有完全相同的内容,除了:

  • 部署的战争不同(我重新开始,删除了 webapps/* 战争文件和目录)
  • conf/server.xml文件不同(设置不同的端口)
  • bin/catalina.bat 文件不同(将 CATALINA_HOME 更改为每个实例的完整路径)

其余的都一样。

问题是每个战争的 META-INF/context.xml 文件指向不同的数据库,一个用于开发,一个用于 alpha。更具体地说连接URL不同,更具体地说只有数据库名称不同(斜杠和URL问号之间的字符串)。

但是,由于某种原因启动了两个实例后,它们都指向 Dev 数据库。也就是说,他们可能都在读取 Dev context.xml,并且可能是相同的 webapps/AppName 文件夹

这怎么可能?

当我启动 Dev tomcat 时,控制台显示 CATALINA_HOME、CATALINA_BASE、CATALINA_TMPDIR 和 CLASSPATH 的值,它们都显示了 Dev tomcat 目录的完整路径。

当我启动 Alpha tomcat 时,控制台也会显示这些变量的值,并且它们都显示到 Alpha tomcat 目录的完整路径(因此路径似乎没问题)。

我检查了部署的 alpha_tomcat_dir/webapps/AppName/META-INF/context.xml 文件,它确实显示了 alpha 数据库配置。

但在运行时它仍然使用Dev数据库的db信息。

我还应该去哪里看?

这些是 context.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Context>

    <Resource name="jdbc/hng" 
        auth="Container"
        driverClassName="com.mysql.jdbc.Driver" 
        type="javax.sql.DataSource"

        maxActive="60" 
        minIdle="5"
        maxIdle="60" 
        maxWait="10000"
        testOnBorrow="true" 
        testOnReturn="true"
        testWhileIdle="true" 
        validationQuery="SELECT 1"
        timeBetweenEvictionRunsMillis="20000" 
        minEvictableIdleTimeMillis="300000"
        removeAbandoned="true" 
        removeAbandonedTimeout="180"
        logAbandoned="true"

        username="root"
        password="<removed>" 

        url="jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true&amp;autoReconnectForPools=true" />

</Context>

这些文件仅在数据库名称上有所不同。它是 dev 的“hngdev”和 alpha 的“hngalpha”(而不是 dbname)

【问题讨论】:

  • 使用什么数据库服务器? mysql?
  • 想与我们分享您的上下文文件吗?
  • 这里有 config.xml 文件。我 100% 确定这只是 db 差异,我检查了 winmerge 中的差异,以防我的眼睛在跟我开玩笑。
  • 等等!当我进行像 DataSource ds = (DataSource)(new InitialContext()).lookup("java:comp/env/jdbc/hng") 之类的查找时...我查找的资源是否跨多个进程共享?它是否有可能不尝试从我的 context.xml 构建连接池,因为该路径的一个资源已经存在于另一个 java 进程中?

标签: java tomcat tomcat6


【解决方案1】:

如果你 100% 确定上下文内容是正确的,

然后我会说检查您在数据库服务器中的设置。

可能是您在数据库服务器中创建了错误的用户?给予 alpha 用户和 dev 用户相同的权限。也许您为两者复制粘贴了相同的授权用户查询?

您还可以尝试将 alpha 上下文中的数据库信息更改为一些错误的用户信息/端口。它仍然连接吗?

【讨论】:

  • 是的,我实际上不需要检查数据库,因为我在两个 tomcat 实例中远程调试了应用程序并检查了数据源,它们都显示了相同的连接 url:jdbc:mysql: //127.0.0.1:3306/hngalpha?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&autoReconnectForPools=true
  • 是的,你是对的,我对 dev 和 alpha 使用相同的用户,并且它被授予访问两个 dbs 的权限(这是一个糟糕的做法),但问题仍然是两者envCtx.lookup("jdbc/hng") 实例返回一个指向 dev 数据库 (hngdev) 的 DataSource,即使 alpha 的 context.xml 文件将 hngalpha 指定为 db 连接 URL 中的数据库。
  • 我确实检查了你所说的,我设置了错误的用户名和密码,并且数据库名称不存在。它仍然成功连接到 dev。所以我有点确定 alpha 的 context.xml 永远不会被读取,也许整个 webapp 内容都不会被使用。奇怪的是,当我启动 alpha 实例时,它确实扩展/部署了战争
【解决方案2】:

问题是我在 $CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml 中有一个与开发环境相同的 context.xml 文件

由于我的 server.xml 配置,在我复制整个 tomcat 目录结构以创建 alpha tomcat 环境之前,曾经将上下文描述符复制到那里。由于我的 server.xml 配置,它没有在应用程序的新部署中更新。数据源信息是从 $CATALINA_BASE/conf/[enginename]/[hostname]/[webappname].xml 中读取的,这是我不知道或没有预料到的。

以下是上下文和部署如何在不同服务器配置上工作的详细说明:

http://tomcat.apache.org/tomcat-7.0-doc/config/context.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多