MyBatis Spring в мультитенантном приложении - PullRequest
4 голосов
/ 24 февраля 2012

Привет нужна помощь в использовании пружины MyBatis для мультитенанта приложение ...

Возможно ли это? Тем более что я не вижу как «MapperScannerConfigurer» можно настроить с помощью sqlSessionFactory по адресу время выполнения.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2015

Spring имеет AbstractRoutingDataSource для решения этой проблемы

http://spring.io/blog/2007/01/23/dynamic-datasource-routing/

0 голосов
/ 01 ноября 2013

Можно создать источник данных с областью действия арендатора, используя фабрику, и подключить его к 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>>, то есть имя арендатора для сопоставления компонентов области. Отправляется данному арендатору на основании понятия текущий арендатор.

...