单机根据主机使用数据库.war

Use a database according to host in single .war

我有一个 war (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。

我是否可以使用上下文或其他方式实现此目的?

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

@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。