发布
社区首页 >问答首页 >猫猫:1次战争,2次部署,2次吐露

猫猫:1次战争,2次部署,2次吐露
EN

Stack Overflow用户
提问于 2017-12-08 10:13:43
回答 3查看 176关注 0票数 5

简化情况:

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

我想要的是每个want应用程序指向一个不同的数据库。因此,/a上的webapp指向数据库A,/b上的webapp指向数据库B。

你怎么解决这个问题?(不分裂战争本身)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-11 21:49:21

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

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

代码语言:javascript
代码运行次数:0
复制
<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“。将相同的war部署到/a/b。他们将在不同的数据库上工作。

票数 9
EN

Stack Overflow用户

发布于 2018-01-17 00:12:12

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

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

票数 2
EN

Stack Overflow用户

发布于 2018-01-18 13:32:15

有人建议使用getContextPath(),下面是一种将其与getInitParameter()一起使用的技术

例如,如果您有两个上下文:"/dev“和"/prod”--这两个上下文都是因地制宜的--并且使用如下条目设置了web.xml文件:

代码语言:javascript
代码运行次数:0
复制
<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>

用这样的方法:

代码语言:javascript
代码运行次数:0
复制
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上下文上返回,在/dev上下文中返回127.0.0.1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47712120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档