Tomcat:1次战争,部署2次,2次配置

时间:2017-12-08 10:13:44

标签: java tomcat configuration-files

简化情况:

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

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

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

3 个答案:

答案 0 :(得分:9)

您可以通过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查找将数据源绑定到&#34; appDataSource&#34; 。将同一战争部署到/a/b。他们将在不同的数据库上工作。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

建议使用

getContextPath(),这是一种与getInitParameter()

一起使用的技巧

例如,如果您有两个上下文:“ / dev ”和“ / prod ” - 两者都是缩进的 - 并且您设置了网络。 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 上下文。