🚀 Spring Boot Multi-Database + JPA Full Notes
📌 1. Overview
- Connect multiple databases in Spring Boot
- Each DB has separate configuration
- Used in microservices, legacy integration, multi-tenant apps
⚙️ 2. application.yml
spring:
datasource:
db1:
url: jdbc:mysql://localhost:3306/db1
username: root
password: root
db2:
url: jdbc:postgresql://localhost:5432/db2
username: postgres
password: postgres
🏗️ 3. DataSource Configuration
@Bean
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource db1DataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource db2DataSource() {
return DataSourceBuilder.create().build();
}
🏭 4. EntityManagerFactory
- Factory that creates EntityManager
- One per database
- Heavy, singleton object
@Bean
public LocalContainerEntityManagerFactoryBean db1EntityManagerFactory(
EntityManagerFactoryBuilder builder,
DataSource dataSource) {
return builder
.dataSource(dataSource)
.packages("com.example.db1.entity")
.persistenceUnit("db1")
.build();
}
🔁 5. TransactionManager
@Bean
public PlatformTransactionManager db1TransactionManager(
EntityManagerFactory emf) {
return new JpaTransactionManager(emf);
}
🧠 6. EntityManager
- Used for CRUD operations
- Interacts with persistence context
@PersistenceContext
private EntityManager entityManager;
🧠 7. Persistence Context
- First-level cache
- Stores managed entities
- Handles dirty checking
EntityManager → Persistence Context → Database
🧠 8. Single DB Flow Diagram
🚀 Spring Boot Application
|
+------------------------------+
| TransactionManager |
+------------------------------+
|
↓
+------------------------------+
| EntityManagerFactory |
+------------------------------+
|
-----------------------------------------
| | |
EntityManager EntityManager EntityManager
| | |
↓ ↓ ↓
Persistence Persistence Persistence
Context Context Context
| | |
↓ ↓ ↓
----------- Managed Entities ----------
|
↓
DataSource
|
↓
Database
🔥 9. Multi-Database Diagram
Spring Boot Application
|
-----------------------------------------------------
| |
TransactionManager(DB1) TransactionManager(DB2)
| |
EntityManagerFactory(DB1) EntityManagerFactory(DB2)
| |
EntityManager EntityManager
| |
Persistence Context(DB1) Persistence Context(DB2)
| |
Entities(DB1) Entities(DB2)
| |
DataSource(DB1) DataSource(DB2)
| |
Database(MySQL) Database(PostgreSQL)
🔄 10. Flow Steps
TransactionManager
↓
EntityManagerFactory
↓
EntityManager
↓
Persistence Context
↓
Entities
↓
DataSource
↓
Database
🧩 11. Entity Example
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Long id;
}
⚠️ 12. Important Rules
- One EntityManagerFactory per DB
- Separate packages for entities
- Separate TransactionManager
- Always use correct qualifier
💡 13. Best Practices
- Use meaningful bean names
- Keep DB configs isolated
- Avoid cross DB transactions
🎯 14. Final Summary
TransactionManager
↓
EntityManagerFactory
↓
EntityManager
↓
Persistence Context
↓
Entities
↓
Database