简化情况:
/a
上部署了一个webapp,在contextpath /b
部署了一个webapp。 我想要的是每个webapp都指向不同的数据库。因此,/a
上的webapp指向数据库 A ,/b
上的webapp指向数据库 B 。
你会如何解决这个问题? (没有分裂战争本身)
答案 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 上下文。