2016-06-28 6 views
2

Я работаю в среде с несколькими арендаторами, где доступ к данным можно получить из примерно 10 различных источников данных (и сущ.) С интерфейсом webapplication (rest).Стратегия доступа к данным в среде с несколькими арендаторами с Spring и Hibernate

Управляющий объект, который будет использоваться, зависит от параметра URL в остальном api, например. api/orders//1000003.

Мне нужно использовать entitymanager «1» для извлечения данных. В настоящий момент я использую метод на уровне репозитория, где я вызываю setDistrict (1), перед созданием сеанса спящего режима и созданием запроса через спящий критерий.

Все работает нормально, но меня беспокоит тот факт, что этот метод необходимо синхронизировать, чтобы избежать получения данных от неправильного лица. Когда я синхронизирую метод репозитория, я обеспокоен тем, что производительность будет ужасной.

Какова хорошая стратегия для реализации этого доступа с несколькими арендаторами, поэтому производительность хорошая, и правильные данные будут возвращены при большой нагрузке ?

Спасибо за ваш совет.

ответ

1

SessionFactory из спящего режима позволяет использовать tenancy behavior:

  • SCHEMA коррелируется отдельного подхода схемы. Ошибка при попытке открыть сеанс без идентификатора арендатора с использованием этой стратегии. Кроме того, необходимо указать org.hibernate.service.jdbc.connections.spi.MultiTenantConnectionProvider .

  • DATABASE Соответствует раздельному подходу базы данных. Ошибка при попытке открыть сеанс без идентификатора арендатора , используя эту стратегию. Кроме того, необходимо указать org.hibernate.service.jdbc.connections.spi.MultiTenantConnectionProvider .

  • ДИСКРИМИНАТОР Соответствует раздельному (дискриминаторному) подходу. При попытке открыть сеанс без идентификатора арендатора с использованием этой стратегии. Эта стратегия еще не реализована в Hibernate с 4.0 и 4.1. Его поддержка запланирована на 5,0.

В вашем случае я думаю, что вам нужно SCHEMA или DATABASE и должны реализовать MultiTenantConnectionProvider (source).

/** 
* Simplisitc implementation for illustration purposes supporting 2 hard coded providers (pools) and leveraging 
* the support class {@link org.hibernate.service.jdbc.connections.spi.AbstractMultiTenantConnectionProvider} 
*/ 
public class MultiTenantConnectionProviderImpl extends AbstractMultiTenantConnectionProvider { 
    private final ConnectionProvider acmeProvider = ConnectionProviderUtils.buildConnectionProvider("acme"); 
    private final ConnectionProvider jbossProvider = ConnectionProviderUtils.buildConnectionProvider("jboss"); 

    @Override 
    protected ConnectionProvider getAnyConnectionProvider() { 
     return acmeProvider; 
    } 

    @Override 
    protected ConnectionProvider selectConnectionProvider(String tenantIdentifier) { 
     if ("acme".equals(tenantIdentifier)) { 
      return acmeProvider; 
     } 
     else if ("jboss".equals(tenantIdentifier)) { 
      return jbossProvider; 
     } 
     throw new HibernateException("Unknown tenant identifier"); 
    } 
} 

Подробнее см. Связанную документацию.