简化情况:
/a
上部署,一次在contextpath /b
上部署。我想要的是每个want应用程序指向一个不同的数据库。因此,/a
上的webapp指向数据库A,/b
上的webapp指向数据库B。
你怎么解决这个问题?(不分裂战争本身)
发布于 2018-01-11 21:49:21
您可以通过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“。将相同的war部署到/a
和/b
。他们将在不同的数据库上工作。
发布于 2018-01-17 00:12:12
您可以以编程方式获取当前上下文,并根据获得的值配置数据源。例如,使用javax.servlet.ServletContext.getContextPath().
还可以根据上下文名称加载属性文件。
发布于 2018-01-18 13:32:15
有人建议使用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上下文上返回,在/dev上下文中返回127.0.0.1。
https://stackoverflow.com/questions/47712120
复制相似问题