Ada beberapa cara menguliti kucing di sini. Pada dasarnya semua bermuara pada tingkat mana Anda ingin menerapkan sewa.
Dasar
Pendekatan dasarnya adalah untuk mengikat beberapa jenis kunci yang mengidentifikasi pelanggan pada basis per-utas, sehingga Anda dapat mengetahui tentang pelanggan yang terkait dengan rangkaian eksekusi saat ini. Ini biasanya dicapai dengan mengisi ThreadLocal
dengan beberapa informasi terkait otentikasi karena Anda biasanya dapat memperoleh penyewa dari pengguna yang masuk.
Sekarang jika itu ada, ada beberapa pilihan tempat untuk menerapkan pengetahuan penyewa. Biarkan saya menguraikan secara singkat yang paling umum:
Multi-tenancy di tingkat database
Salah satu cara untuk memisahkan data untuk beberapa klien adalah dengan memiliki database individual per penyewa. Abstraksi inti Spring Data MongoDB untuk ini adalah MongoDBFactory
antarmuka. Cara termudah di sini adalah mengganti SimpleMongoDbFactory.getDb(String name)
dan panggil metode induk dengan nama database mis. diperkaya dengan awalan penyewa atau sejenisnya.
Multi-penyewaan di tingkat pengumpulan
Pilihan lain adalah memiliki koleksi khusus penyewa, mis. melalui penyewa sebelum atau sesudah perbaikan. Mekanisme ini sebenarnya dapat dimanfaatkan dengan menggunakan bahasa Spring Expression (SpEl) di @Document
collectionName
anotasi atribut. Pertama, ekspos awalan penyewa melalui kacang Spring:
@Component("tenantProvider")
public class TenantProvider {
public String getTenantId() {
// … implement ThreadLocal lookup here
}
}
Kemudian gunakan SpEL dalam jenis domain Anda @Document
pemetaan:
@Document(collectionName = "#{tenantProvider.getTenantId()}_accounts"
public class Account { … }
SpEl memungkinkan Anda untuk merujuk ke kacang Spring dengan nama dan menjalankan metode pada mereka. MongoTemplate
(dan dengan demikian abstraksi repositori secara transitif) akan menggunakan metadata pemetaan dari kelas dokumen dan subsistem pemetaan akan mengevaluasi collectionName
atribut untuk mencari tahu tentang koleksi untuk berinteraksi.