SlideShare a Scribd company logo
MULTI-TENANCY
in Java applications

@ladislavGazo
gazo@seges.sk
THE APPLICATION
user
|
bunch of JavaScript
|
service
|
domain model
IMPLICATION
user1 ... userN
|
same bunch of JavaScript
|
service
|
ONE database
ONE APPLICATION TO RULE THEM ALL
The term multi-tenancy in general is applied to software
development to indicate an architecture in which a single running
instance of an application simultaneously serves multiple clients
(tenants).
This is highly common in SaaS solutions.
Isolating information (data, customizations, etc) pertaining to the
various tenants is a particular challenge in these systems.
SPLIT ME NOW!
user1 -> BA, user2 -> BA, user 3 -> KE, user 4 -> ZA
|
again the same JavaScript
|
(almost) the same service
|
DB (BA), DB (KE), DB (ZA)
a lot of "tenant" dependent data - high volumes
performance
separation -> easier backup and restore
scalability of front-end and service layer
HIBERNATE IS THE EASIEST
MULTI-TENANT CONFIGURATION
<rprynm=hbraemlieac"vle"AAAE /
poet ae"ient.utTnny au=DTBS" >
<rprynm=hbraetnn_dniirrsle"vle"ksgshodlnecniuainMlieatdniireovr /
poet ae"ient.eatietfe_eovr au=s.ee.rdeei.ofgrto.utTnnIetfeRsle" >

<rprynm=hbraemlitnn_oncinpoie"vle"r.ient.evc.dccnetossi
poet ae"ient.ut_eatcneto_rvdr au=oghbraesriejb.oncin.p.
DtSucBsdutTnnCnetoPoieIp"/
aaoreaeMlieatoncinrvdrml >

<rprynm=hbraecneto.aaore vle"aacm/n/dch"/
poet ae"ient.oncindtsuc" au=jv:opevjb/r >

<rprynm=hbraemlitnn.aaoreietfe_o_n"vle"eal"/
poet ae"ient.ut_eatdtsuc.dniirfray au=dfut >
SWITCH IT ON

hbraemlieac
ient.utTnny
CONFIGURE WHERE TO LOOK FOR THE
CURRENT TENANT IDENTIFIER

hbraetnn_dniirrsle
ient.eatietfe_eovr
WHERE ARE MY CONNECTIONS?

hbraemlitnn_oncinpoie
ient.ut_eatcneto_rvdr

Hibernate's
DataSourceBasedMultiTenantConnectionProviderImpl
utilizes JNDI lookups
POINT TO JNDI ROOT FOR DATASOURCES

hbraecneto.aaore
ient.oncindtsuc
... AND THE DEFAULT

hbraemlitnn.aaoreietfe_o_n
ient.ut_eatdtsuc.dniirfray

So in the end =

jv:opevjb/rdfut
aacm/n/dch/eal
BUT THERE ARE THINGS THAT DON'T WORK
EHCache configuration from previous version is different
Hibernate's internal schema update does not work
NPE !!! ........ who would have said that
MIGRATION
HIBERNATE EXPORTER
is not helpful
DO YOU HAVE ENVERS?
then you need custom exporter
IT IS EASY TO WRITE
but don't forget the AuditConfiguration
EbCniuainjaofgrto =nwEbCniuain)cniue
j3ofgrto pCniuain
e j3ofgrto(.ofgr(
uiNm,nl)
ntae ul;
Cniuainhbraeofgrto =jaofgrto
ofgrto ientCniuain
pCniuain
.eHbraeofgrto(;
gtientCniuain)
hbraeofgrto.ulMpig(;
ientCniuainbidapns)
Adtofgrto adtofgrto =Adtofgrto.eFr
uiCniuain uiCniuain
uiCniuaingto(
hbraeofgrto)
ientCniuain;

and use EnversSchemaGenerator at last
GET RID OF NPE BUG

{"ient.utTnny,
hbraemlieac"
"ient.eatietfe_eovr,
hbraetnn_dniirrsle"
"ient.ut_eatcneto_rvdr,
hbraemlitnn_oncinpoie"
"ient.oncindtsuc"
hbraecneto.aaore,
"ient.ut_eatdtsuc.dniirfray }
hbraemlitnn.aaoreietfe_o_n"
RUN THE EXPORTER FROM MAVEN
COMBINE IT WITH LIQUIBASE

version 3.0.6 contains feature to populate all tenant databases
Mlieatpigiubs
utTnnSrnLqiae
DON'T FORGET...
it is maintenable but generated SQL needs to be checked
existing databases must be moved to "point 0"
A BIT OF LOGGING
http://www.slf4j.org/faq.html#logging_performance
Importance of logging - using MDC to track requests
MCpt"eat,cinOg)
D.u(tnn" letrz;

lgjapne.totlyu.ovrinatr =AP[dIO61]-%5
o4.pedrsdu.aotCnesoPten
P %{S80}
-p
[t%{eat|Xrqetd]%:M%3.0{}-%%
%|Xtnn}%{eusI} F% -03c1
mn
AND THE MOST BORING...

DESIGN
your app to be multi-tenant
SEND TENANT IDENTIFICATION
in HTTP Header
use Filter to get it out
in Service parameters
using ThreadLocal variable
via tenant-URL-based service calls
rmi://localhost:12345/<tenant>/<service>
etc...
THANKS FOR LISTENING

@ladislavGazo
gazo@seges.sk

More Related Content

What's hot (20)

PDF
MySQL Database Architectures - High Availability and Disaster Recovery Solution
Miguel Araújo
 
PPTX
What Is Apache Spark? | Introduction To Apache Spark | Apache Spark Tutorial ...
Simplilearn
 
PPTX
Quiery builder
Devireddy Ravindrareddy
 
PDF
Database Cloud Services Office Hours : Oracle sharding hyperscale globally d...
Tammy Bednar
 
ODP
An Introduction to Hashing and Salting
Rahul Singh
 
PDF
Oracle to Postgres Migration - part 2
PgTraining
 
PDF
주니어 개발자의 서버 로그 관리 개선기
Yeonhee Kim
 
PDF
Introduction to Spring webflux
Knoldus Inc.
 
PDF
Spring Meetup Paris - Back to the basics of Spring (Boot)
Eric SIBER
 
PPT
Java Persistence API (JPA) Step By Step
Guo Albert
 
PPTX
Spring data jpa
Jeevesh Pandey
 
PPTX
SOA Principles : 6. service composibility
Mohamed Zakarya Abdelgawad
 
PPTX
IBM MQ on cloud and containers
Robert Parker
 
PPTX
Big Data Storage - Comparing Speed and Features for Avro, JSON, ORC, and Parquet
DataWorks Summit
 
PPT
Presentation Spring
Nathaniel Richand
 
PDF
Spring Boot and Microservices
seges
 
PPTX
Enterprise Software Architecture styles
Araf Karsh Hamid
 
PPT
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...
Kai Wähner
 
PDF
HBase and Hadoop at Adobe
Cosmin Lehene
 
PDF
Con7091 sql tuning for expert db as-oow17_oct2_1507314871265001m0x4
asifanw
 
MySQL Database Architectures - High Availability and Disaster Recovery Solution
Miguel Araújo
 
What Is Apache Spark? | Introduction To Apache Spark | Apache Spark Tutorial ...
Simplilearn
 
Quiery builder
Devireddy Ravindrareddy
 
Database Cloud Services Office Hours : Oracle sharding hyperscale globally d...
Tammy Bednar
 
An Introduction to Hashing and Salting
Rahul Singh
 
Oracle to Postgres Migration - part 2
PgTraining
 
주니어 개발자의 서버 로그 관리 개선기
Yeonhee Kim
 
Introduction to Spring webflux
Knoldus Inc.
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Eric SIBER
 
Java Persistence API (JPA) Step By Step
Guo Albert
 
Spring data jpa
Jeevesh Pandey
 
SOA Principles : 6. service composibility
Mohamed Zakarya Abdelgawad
 
IBM MQ on cloud and containers
Robert Parker
 
Big Data Storage - Comparing Speed and Features for Avro, JSON, ORC, and Parquet
DataWorks Summit
 
Presentation Spring
Nathaniel Richand
 
Spring Boot and Microservices
seges
 
Enterprise Software Architecture styles
Araf Karsh Hamid
 
Showdown: Integration Framework (Spring Integration, Apache Camel) vs. Enterp...
Kai Wähner
 
HBase and Hadoop at Adobe
Cosmin Lehene
 
Con7091 sql tuning for expert db as-oow17_oct2_1507314871265001m0x4
asifanw
 

Viewers also liked (20)

PDF
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
Rodrigo Cândido da Silva
 
PPTX
Multi Tenancy In The Cloud
rohit_ainapure
 
PDF
How to build customizable multitenant web applications - IPC11 Spring Edition
Stephan Hochdörfer
 
PPTX
Multi-Tenant Approach
Perfectial, LLC
 
PDF
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
Innomatic Platform
 
PDF
Multi-tenancy in the cloud
Inphina Technologies
 
PDF
ConFoo 2015 - Supporting Multi-tenancy Applications with Java EE
Rodrigo Cândido da Silva
 
PDF
JVM Multitenancy (JavaOne 2012)
Graeme_IBM
 
PPTX
Multi-Tenancy with Spring Boot
Stormpath
 
PPT
Making Apache Tomcat Multi-tenant, Elastic and Metered
Paul Fremantle
 
PPT
Multi-tenancy In the Cloud
sdevillers
 
PPTX
Multi tenant architecture
Eastern Software Systems
 
ODP
Multi-Tenant SOA Middleware for Cloud Computing
Srinath Perera
 
PDF
Suportando Aplicações Multi-tenancy com Java EE
Rodrigo Cândido da Silva
 
PPTX
A Multi-tenant Architecture for Business Process Executions
Srinath Perera
 
PDF
RESTful API Design, Second Edition
Apigee | Google Cloud
 
PPTX
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
CA API Management
 
PDF
Testing untestable code - phpday
Stephan Hochdörfer
 
PDF
How to build customizable multitenant web applications - PHPBNL11
Stephan Hochdörfer
 
PDF
Java EE 7 - Novidades e Mudanças
Bruno Borges
 
JavaOne 2014 - Supporting Multi-tenancy Applications with Java EE
Rodrigo Cândido da Silva
 
Multi Tenancy In The Cloud
rohit_ainapure
 
How to build customizable multitenant web applications - IPC11 Spring Edition
Stephan Hochdörfer
 
Multi-Tenant Approach
Perfectial, LLC
 
Building Multi-Tenant and SaaS products in PHP - CloudConf 2015
Innomatic Platform
 
Multi-tenancy in the cloud
Inphina Technologies
 
ConFoo 2015 - Supporting Multi-tenancy Applications with Java EE
Rodrigo Cândido da Silva
 
JVM Multitenancy (JavaOne 2012)
Graeme_IBM
 
Multi-Tenancy with Spring Boot
Stormpath
 
Making Apache Tomcat Multi-tenant, Elastic and Metered
Paul Fremantle
 
Multi-tenancy In the Cloud
sdevillers
 
Multi tenant architecture
Eastern Software Systems
 
Multi-Tenant SOA Middleware for Cloud Computing
Srinath Perera
 
Suportando Aplicações Multi-tenancy com Java EE
Rodrigo Cândido da Silva
 
A Multi-tenant Architecture for Business Process Executions
Srinath Perera
 
RESTful API Design, Second Edition
Apigee | Google Cloud
 
Best Practices You Must Apply to Secure Your APIs - Scott Morrison, SVP & Dis...
CA API Management
 
Testing untestable code - phpday
Stephan Hochdörfer
 
How to build customizable multitenant web applications - PHPBNL11
Stephan Hochdörfer
 
Java EE 7 - Novidades e Mudanças
Bruno Borges
 
Ad

Similar to Multi-tenancy in Java (20)

PPT
SAP ABAP Lock concept and enqueue
Milind Patil
 
PDF
UEMB240: Managing Your User Profile Data at Scale
Ivanti
 
PDF
Liberating web apps from the server
Alexander Gyoshev
 
PDF
Functional Web Development
FITC
 
PDF
Katello on TorqueBox
lzap
 
PDF
RxSwift for Beginners - how to avoid a headache of reactive programming
Maciej Kołek
 
PPTX
The Very Very Latest in Database Development - Oracle Open World 2012
Lucas Jellema
 
PPTX
The Very Very Latest In Database Development - Lucas Jellema - Oracle OpenWor...
Getting value from IoT, Integration and Data Analytics
 
PDF
Testing Delphix: easy data virtualization
Franck Pachot
 
PDF
Why we choose Symfony2
Merixstudio
 
PPTX
Re:code, frp vs async await ( Peter Ovchinnikov )
Iryna Datsyshyn
 
PDF
A sane approach to microservices
Toby Matejovsky
 
PDF
JavaFX Enterprise (JavaOne 2014)
Hendrik Ebbers
 
PPTX
Optimizing apps for better performance extended
Elif Boncuk
 
PDF
Oracle Drivers configuration for High Availability, is it a developer's job?
Ludovico Caldara
 
DOCX
Db2 migration -_tips,_tricks,_and_pitfalls
sam2sung2
 
PDF
Ebs dba con4696_pdf_4696_0001
jucaab
 
PPTX
OOW16 - Oracle Database 12c - The Best Oracle Database 12c New Features for D...
Alex Zaballa
 
PPTX
OOW16 - Oracle Database 12c - The Best Oracle Database 12c New Features for D...
Alex Zaballa
 
PPTX
Deploy and Destroy: Testing Environments - Michael Arenzon - DevOpsDays Tel A...
DevOpsDays Tel Aviv
 
SAP ABAP Lock concept and enqueue
Milind Patil
 
UEMB240: Managing Your User Profile Data at Scale
Ivanti
 
Liberating web apps from the server
Alexander Gyoshev
 
Functional Web Development
FITC
 
Katello on TorqueBox
lzap
 
RxSwift for Beginners - how to avoid a headache of reactive programming
Maciej Kołek
 
The Very Very Latest in Database Development - Oracle Open World 2012
Lucas Jellema
 
The Very Very Latest In Database Development - Lucas Jellema - Oracle OpenWor...
Getting value from IoT, Integration and Data Analytics
 
Testing Delphix: easy data virtualization
Franck Pachot
 
Why we choose Symfony2
Merixstudio
 
Re:code, frp vs async await ( Peter Ovchinnikov )
Iryna Datsyshyn
 
A sane approach to microservices
Toby Matejovsky
 
JavaFX Enterprise (JavaOne 2014)
Hendrik Ebbers
 
Optimizing apps for better performance extended
Elif Boncuk
 
Oracle Drivers configuration for High Availability, is it a developer's job?
Ludovico Caldara
 
Db2 migration -_tips,_tricks,_and_pitfalls
sam2sung2
 
Ebs dba con4696_pdf_4696_0001
jucaab
 
OOW16 - Oracle Database 12c - The Best Oracle Database 12c New Features for D...
Alex Zaballa
 
OOW16 - Oracle Database 12c - The Best Oracle Database 12c New Features for D...
Alex Zaballa
 
Deploy and Destroy: Testing Environments - Michael Arenzon - DevOpsDays Tel A...
DevOpsDays Tel Aviv
 
Ad

More from seges (7)

PDF
Automated Tomcat Management
seges
 
PDF
Javist Being Cheftain
seges
 
PDF
OSGi experiments
seges
 
PDF
Internetová prítomnosť a content management
seges
 
PDF
AngularJS first steps
seges
 
PDF
GWT Workshop
seges
 
PDF
Ako sme zistili ze asi robime Scrum
seges
 
Automated Tomcat Management
seges
 
Javist Being Cheftain
seges
 
OSGi experiments
seges
 
Internetová prítomnosť a content management
seges
 
AngularJS first steps
seges
 
GWT Workshop
seges
 
Ako sme zistili ze asi robime Scrum
seges
 

Recently uploaded (20)

PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PPTX
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
Blockchain Transactions Explained For Everyone
CIFDAQ
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PPTX
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
PDF
Wojciech Ciemski for Top Cyber News MAGAZINE. June 2025
Dr. Ludmila Morozova-Buss
 
PDF
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
PDF
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PPTX
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PPTX
Top iOS App Development Company in the USA for Innovative Apps
SynapseIndia
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
PPTX
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PDF
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
PDF
Why Orbit Edge Tech is a Top Next JS Development Company in 2025
mahendraalaska08
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
✨Unleashing Collaboration: Salesforce Channels & Community Power in Patna!✨
SanjeetMishra29
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Blockchain Transactions Explained For Everyone
CIFDAQ
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Building Search Using OpenSearch: Limitations and Workarounds
Sease
 
Wojciech Ciemski for Top Cyber News MAGAZINE. June 2025
Dr. Ludmila Morozova-Buss
 
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
SFWelly Summer 25 Release Highlights July 2025
Anna Loughnan Colquhoun
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
MSP360 Backup Scheduling and Retention Best Practices.pptx
MSP360
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Top iOS App Development Company in the USA for Innovative Apps
SynapseIndia
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Windsurf Meetup Ottawa 2025-07-12 - Planning Mode at Reliza.pdf
Pavel Shukhman
 
UiPath Academic Alliance Educator Panels: Session 2 - Business Analyst Content
DianaGray10
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
SWEBOK Guide and Software Services Engineering Education
Hironori Washizaki
 
Why Orbit Edge Tech is a Top Next JS Development Company in 2025
mahendraalaska08
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 

Multi-tenancy in Java

  • 2. THE APPLICATION user | bunch of JavaScript | service | domain model
  • 3. IMPLICATION user1 ... userN | same bunch of JavaScript | service | ONE database
  • 4. ONE APPLICATION TO RULE THEM ALL The term multi-tenancy in general is applied to software development to indicate an architecture in which a single running instance of an application simultaneously serves multiple clients (tenants). This is highly common in SaaS solutions. Isolating information (data, customizations, etc) pertaining to the various tenants is a particular challenge in these systems.
  • 5. SPLIT ME NOW! user1 -> BA, user2 -> BA, user 3 -> KE, user 4 -> ZA | again the same JavaScript | (almost) the same service | DB (BA), DB (KE), DB (ZA)
  • 6. a lot of "tenant" dependent data - high volumes performance separation -> easier backup and restore scalability of front-end and service layer
  • 8. MULTI-TENANT CONFIGURATION <rprynm=hbraemlieac"vle"AAAE / poet ae"ient.utTnny au=DTBS" > <rprynm=hbraetnn_dniirrsle"vle"ksgshodlnecniuainMlieatdniireovr / poet ae"ient.eatietfe_eovr au=s.ee.rdeei.ofgrto.utTnnIetfeRsle" > <rprynm=hbraemlitnn_oncinpoie"vle"r.ient.evc.dccnetossi poet ae"ient.ut_eatcneto_rvdr au=oghbraesriejb.oncin.p. DtSucBsdutTnnCnetoPoieIp"/ aaoreaeMlieatoncinrvdrml > <rprynm=hbraecneto.aaore vle"aacm/n/dch"/ poet ae"ient.oncindtsuc" au=jv:opevjb/r > <rprynm=hbraemlitnn.aaoreietfe_o_n"vle"eal"/ poet ae"ient.ut_eatdtsuc.dniirfray au=dfut >
  • 10. CONFIGURE WHERE TO LOOK FOR THE CURRENT TENANT IDENTIFIER hbraetnn_dniirrsle ient.eatietfe_eovr
  • 11. WHERE ARE MY CONNECTIONS? hbraemlitnn_oncinpoie ient.ut_eatcneto_rvdr Hibernate's DataSourceBasedMultiTenantConnectionProviderImpl utilizes JNDI lookups
  • 12. POINT TO JNDI ROOT FOR DATASOURCES hbraecneto.aaore ient.oncindtsuc
  • 13. ... AND THE DEFAULT hbraemlitnn.aaoreietfe_o_n ient.ut_eatdtsuc.dniirfray So in the end = jv:opevjb/rdfut aacm/n/dch/eal
  • 14. BUT THERE ARE THINGS THAT DON'T WORK EHCache configuration from previous version is different Hibernate's internal schema update does not work NPE !!! ........ who would have said that
  • 17. DO YOU HAVE ENVERS? then you need custom exporter
  • 18. IT IS EASY TO WRITE but don't forget the AuditConfiguration EbCniuainjaofgrto =nwEbCniuain)cniue j3ofgrto pCniuain e j3ofgrto(.ofgr( uiNm,nl) ntae ul; Cniuainhbraeofgrto =jaofgrto ofgrto ientCniuain pCniuain .eHbraeofgrto(; gtientCniuain) hbraeofgrto.ulMpig(; ientCniuainbidapns) Adtofgrto adtofgrto =Adtofgrto.eFr uiCniuain uiCniuain uiCniuaingto( hbraeofgrto) ientCniuain; and use EnversSchemaGenerator at last
  • 19. GET RID OF NPE BUG {"ient.utTnny, hbraemlieac" "ient.eatietfe_eovr, hbraetnn_dniirrsle" "ient.ut_eatcneto_rvdr, hbraemlitnn_oncinpoie" "ient.oncindtsuc" hbraecneto.aaore, "ient.ut_eatdtsuc.dniirfray } hbraemlitnn.aaoreietfe_o_n"
  • 20. RUN THE EXPORTER FROM MAVEN
  • 21. COMBINE IT WITH LIQUIBASE version 3.0.6 contains feature to populate all tenant databases Mlieatpigiubs utTnnSrnLqiae
  • 22. DON'T FORGET... it is maintenable but generated SQL needs to be checked existing databases must be moved to "point 0"
  • 23. A BIT OF LOGGING http://www.slf4j.org/faq.html#logging_performance Importance of logging - using MDC to track requests MCpt"eat,cinOg) D.u(tnn" letrz; lgjapne.totlyu.ovrinatr =AP[dIO61]-%5 o4.pedrsdu.aotCnesoPten P %{S80} -p [t%{eat|Xrqetd]%:M%3.0{}-%% %|Xtnn}%{eusI} F% -03c1 mn
  • 24. AND THE MOST BORING... DESIGN your app to be multi-tenant
  • 25. SEND TENANT IDENTIFICATION in HTTP Header use Filter to get it out in Service parameters using ThreadLocal variable via tenant-URL-based service calls rmi://localhost:12345/<tenant>/<service> etc...