我有一场战争(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 "%r" %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 "%r" %s %b" />
<Context path="" docBase="C:/apache-tomcat-8.0.35/webapps/webapp"
debug="0" reloadable="true"/>
</Host>
是的,我正在使用iBatis和Spring MVC。
无论如何,我可以使用上下文或其他东西来实现这个目标吗?
答案 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。