【问题标题】:Tomcat: 1 war, deployed 2x, 2 configsTomcat:1 场战争,2 次部署,2 次配置
【发布时间】:2018-05-22 13:37:00
【问题描述】:

简化情况:

  • 我有 1 个 Tomcat 容器和 1 个使用数据库的 WAR。
  • 数据库配置位于属性文件中(战争中)。
  • 我部署了 WAR 2 次,一个 webapp 在 contextpath /a 上,一个 webapp 在 contextpath /b 上。
  • 两个 webapp现在都指向同一个数据库(同一个 cfg)。

我想要的是每个 webapp 都指向一个不同的数据库。所以,/a 上的 webapp 指向数据库 A/b 上的 webapp 指向数据库 B

你会如何解决这个问题? (不分裂战争本身)

【问题讨论】:

  • 为什么不把每个war的配置文件改成指向不同的数据库呢?
  • @LukeBajada:我不喜欢构建两场战争,仅仅因为一两个属性不同。
  • @Henry:环境变量或系统属性是系统范围的,因此是容器范围的,因此不是特定于战争的。请解释一下。
  • @codesmith 是的,你是对的,也不会工作。我在想同样的战争部署在不同的Tomcat实例中的情况。

标签: java tomcat configuration-files


【解决方案1】:

您可以通过 Tomcat 的 context.xml 配置来完成,而无需拆分代码。

您可以定义两个上下文,例如 /a/b 以及两个不同的全局数据源 "sharedDataSourceA""sharedDataSourceB"。您可以将不同的全局数据源绑定到这些具有相同名称的上下文,例如 "appDataSource"

<GlobalNamingResources>
  ...
  <Resource name="sharedDataSourceA"
            global="sharedDataSourceA"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            alternateUsernameAllowed="true"
            username="bar"
            password="barpass"
            ...
<Resource name="sharedDataSourceB"
            global="sharedDataSourceB"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            alternateUsernameAllowed="true"
            username="bar"
            password="barpass"
            ...
  ...
</GlobalNamingResources>

<Context path="/a"...>
  ...
  <ResourceLink
            name="appDataSource"
            global="sharedDataSourceA"
            type="javax.sql.DataSource"
            factory="org.apache.naming.factory.DataSourceLinkFactory"
            username="foo"
            password="foopass"
  ...
</Context>
<Context path="/b"...>
  ...
  <ResourceLink
            name="appDataSource"
            global="sharedDataSourceA"
            type="javax.sql.DataSource"
  ...
</Context>

然后在您的代码中,您可以通过 jndi 查找将数据源绑定到 "appDataSource"。将相同的战争部署到 /a/b 。他们将在不同的数据库上工作。

【讨论】:

    【解决方案2】:

    您可以通过编程方式获取当前上下文并根据获取的值配置数据源。例如使用 javax.servlet.ServletContext.getContextPath()。

    您还可以根据上下文名称加载属性文件。

    【讨论】:

      【解决方案3】:

      getContextPath() 被建议使用,这里有一种与getInitParameter() 一起使用的技术

      例如,如果您有两个上下文:“/dev”和“/prod” - 两者都是相同的 - 并且您设置了您的 web。 xml 文件,其中包含以下条目:

      <context-param>
          <param-name>database_ip_prod</param-name>
          <param-value>192.168.1.10</param-value>
      </context-param>
      
      <context-param>
          <param-name>database_ip_dev</param-name>
          <param-value>127.0.0.1</param-value>
      </context-param>
      

      使用这样的方法:

      public String getContextInitParam(
              javax.servlet.ServletContext context, String key) {
          key += context.getContextPath().replace("/","_");
          return context.getInitParameter(key);
      }
      

      来自 jsp 或 servlet 的类似调用:

      getContextInitParam(request.getServletContext(), "database_ip");

      将在 /prod 上下文中返回 192.168.1.10,在 /dev 上返回 127.0.0.1上下文。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 2019-08-05
        • 2018-08-30
        • 1970-01-01
        • 2017-09-21
        • 2012-11-27
        相关资源
        最近更新 更多