MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Правене на spring-data-mongodb като мулти-наемател

Тук има доста начини да одирате котката. По същество всичко се свежда до това на кое ниво искате да приложите наемането.

Основни положения

Основният подход е да се обвърже някакъв вид ключ, идентифициращ клиента на база на нишка, така че да можете да разберете за клиента, с който се занимава текущата нишка на изпълнение. Това обикновено се постига чрез попълване на ThreadLocal с известна информация, свързана с удостоверяването, тъй като обикновено можете да извлечете наемателя от влезлия потребител.

Сега, ако това е на място, има няколко опции за това къде да приложите знанията на наемателя. Позволете ми накратко да очертая най-често срещаните:

Много наемане на ниво база данни

Един от начините за разделяне на данни за множество клиенти е да имате индивидуални бази данни за всеки наемател. Основната абстракция на Spring Data MongoDB за това е MongoDBFactory интерфейс. Най-лесният начин тук е да замените SimpleMongoDbFactory.getDb(String name) и извикайте родителския метод с името на базата данни, напр. обогатено с префикса на наемателя или други подобни.

Много наемане на ниво колекция

Друг вариант е да имате специфични за наемателя колекции, напр. чрез пре- или постфикси на наемател. Този механизъм всъщност може да бъде използван чрез използване на езика Spring Expression (SpEl) в @Document collectionName на анотацията атрибут. Първо, изложете префикса на наемателя чрез Spring bean:

 @Component("tenantProvider")
 public class TenantProvider {

   public String getTenantId() {
     // … implement ThreadLocal lookup here
   }
 }

След това използвайте SpEL във вашите домейни типове @Document картографиране:

 @Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
 public class Account { … }

SpEl ви позволява да се позовавате на Spring bean по име и да изпълнявате методи върху тях. MongoTemplate (и по този начин абстракцията на хранилището транзитивно) ще използва метаданните за картографиране на класа на документа и подсистемата за картографиране ще оцени collectionName атрибут, за да разберете за колекцията, с която да взаимодействате.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да поправя моя mongodb?

  2. Методът за намиране на Mongoose с $или условие не работи правилно

  3. Премахнете обект от вложен масив с $pull и $[identifier] (mongoDB 3.6)

  4. Управление на множество технологии за бази данни с ClusterControl

  5. Mongodb вмъква документ без поле _id