Можно создать источник данных с областью действия арендатора, используя фабрику, и подключить его к SqlSessionFactory, который используется преобразователями, сгенерированными mybatis-spring. Вот соответствующий раздел app-context.xml
<bean id="dataSourceFactory" class="com.myapp.TenantDataSourceFactory"
depends-on="tenant" scope="singleton"/>
<bean id="dataSource" factory-bean="dataSourceFactory" factory-method="getObject"
destroy-method="close" scope="tenant" >
<aop:scoped-proxy/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:myBatisConfig.xml" />
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.myapp" />
<property name="annotationClass" value="com.myapp.mapper.Mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
И TenantDataSourceFactory:
public class TenantDataSourceFactory {
@Autowired Tenant tenant;
public DataSource getObject() throws Exception {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("org.postgresql.Driver");
ds.setUrl(String.format("jdbc:postgresql://%s:%s/%s",
tenant.getDbHost(), tenant.getDbPort(), tenant.getDbName()));
ds.setUsername(tenant.getDbUser());
ds.setPassword(tenant.getDbPassword());
return ds;
}
}
tenant
Область действия - это настраиваемая область, в которой содержится Map<String, Map<String, Object>>
, то есть имя арендатора для сопоставления компонентов области. Отправляется данному арендатору на основании понятия текущий арендатор.