在单个.war中使用根据主机的数据库

时间:2017-04-19 13:54:53

标签: java spring-mvc tomcat java-ee mybatis

我有一场战争(webapp.war),可以从subdomain1.mydomain.com和subdomain2.mydomain.com访问。

我想根据域使用不同的数据库,比如当我访问subdomain1.mydomain.com时我想使用" database1"当我访问subdomain2.mydomain.com时,我想使用" database2"。

我已经在tomcat server.xml中配置了主机:

<Host name="subdomain1.mydomain.com"  appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
   prefix="subdomain1_access_log" suffix=".txt"
   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    <Context path="" docBase="C:/apache-tomcat-8.0.35/webapps/webapp"
    debug="0" reloadable="true"/>
</Host>

<Host name="subdomain2.mydomain.com"  appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
   prefix="subdomain2_access_log" suffix=".txt"
   pattern="%h %l %u %t &quot;%r&quot; %s %b" />

    <Context path="" docBase="C:/apache-tomcat-8.0.35/webapps/webapp"
    debug="0" reloadable="true"/>
</Host>
是的,我正在使用iBatis和Spring MVC。

无论如何,我可以使用上下文或其他东西来实现这个目标吗?

1 个答案:

答案 0 :(得分:2)

您可以使用此注释作为控制器的参数来获取主机名:

@RequestHeader String host

我要做的是创建一个包装器,根据主机名设置适当的数据源。

定义2个数据源,2个sqlSessionFactory和2个MapperFactoryBean(每个域一个):

<bean id="sqlSessionFactoryDomain1" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource1" />
</bean>

<bean id="sqlSessionFactoryDomain2" class="org.mybatis.spring.SqlSessionFactoryBean">
  <property name="dataSource" ref="dataSource2" />
</bean>

<bean id="mapperDomain1" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="com.your.mapper.interface" />
  <property name="sqlSessionFactory" ref="sqlSessionFactoryDomain1" />
</bean>

<bean id="mapperDomain2" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="com.your.mapper.interface" />
  <property name="sqlSessionFactory" ref="sqlSessionFactoryDomain2" />
</bean>

然后创建一个用于访问数据库的服务。该服务将根据主机值使用mapperDomain1或mapperDomain2。