Chuyên mục
Backend
APIs, databases and distributed systems.

Khai datasource thứ hai là tắt auto-config: ba bean phải tự dựng cho mỗi DB, @Primary và tách package entity, @Transactional gọi tên manager — cùng giới hạn không trải transaction qua hai database.

Thứ tự tự nhiên gắn vào lớp với compareTo và bẫy tràn số khi trừ tay, Comparator ghép bằng comparing/thenComparing cùng bẫy reversed() đảo cả chuỗi — và vì sao TimSort ổn định lại quan trọng.

Đưa cache ra khỏi tiến trình: spring.cache.type redis và TTL, đổi serializer JDK sang JSON, RedisTemplate cho counter và rate limit, session store dùng chung — cùng bốn cái bẫy khi Redis chết.

for-each chỉ là đường cú pháp của Iterator: hợp đồng Iterable một method, cơ chế fail-fast với modCount sinh ra ConcurrentModificationException — và hai cách xóa đúng với removeIf và it.remove().

Tốc độ lớn nhất là không truy vấn: cache abstraction với @Cacheable, key SpEL và hai luật sống còn, bộ đôi @CacheEvict/@CachePut giữ cache thật, TTL với Caffeine — và bốn cái bẫy caching.

FIFO xếp hàng và LIFO chồng đĩa, hai bộ method offer/poll/peek, ArrayDeque mảng vòng một mình hai vai (và bản án cho class Stack) — cùng PriorityQueue trên binary heap với bài toán top-K.

Khi nào bỏ JPA viết SQL tay: JdbcTemplate với RowMapper và batchUpdate, JdbcClient mới của Boot 3.2 với tham số có tên và tự map record — cùng công thức trộn JPA + JDBC và bẫy flush.

Cây đỏ-đen giữ key luôn sắp xếp với họ câu hỏi "gần nhất" của NavigableMap, sợi chỉ giữ thứ tự chèn của LinkedHashMap — và ảo thuật LRU cache trong mười dòng với removeEldestEntry.
