in

Software development blog

Field notes from the Puncharsoft team on SAP, enterprise application development, integration and digitalization.

Diagram showing the OData, RFC/JCo, IDoc and CPI integration routes between a Java application and SAP S/4HANA

SAP Java Integration: OData, RFC/JCo, IDoc and CPI Guide

When your Java application has to talk to SAP there are four routes: OData, RFC/BAPI (JCo), IDoc and SAP Integration Suite (CPI). Which is right when, reading and writing the S/4HANA OData API from Spring (including the CSRF flow), calling a BAPI through JCo, master-data synchronization and the pitfalls we see in the field.

Timeline showing the features added between Java 21 and Java 25 LTS and the migration steps

Java 25 LTS: What's New and an Enterprise Migration Plan

Java 21 was the big leap with virtual threads; Java 25 LTS is the 'polish' release enterprise projects will stand on for the next four years. The permanent features that arrived between 21 and 25 (Scoped Values, compact object headers, the AOT cache, flexible constructors), the performance gains and a step-by-step migration plan with library compatibility and pitfalls.

Diagram of a Spring Boot container in a Kubernetes pod showing its probes, resource limits and JVM settings

Spring Boot on Kubernetes: Images, JVM Settings and Probes

'We containerized it, deployed it to Kubernetes, and the pods keep restarting.' Running a Spring Boot application healthily on Kubernetes: small layered images, fast startup with CDS, JVM memory and CPU settings, correctly configured startup/readiness/liveness probes, graceful shutdown and configuration management, with an example Dockerfile and manifest.

Cache-aside read and write flow between the application, the Redis cache and the database

Redis Cache Strategies: Cache-Aside, Write-Through, Eviction

A cache is the fastest performance win in an enterprise application and the most common source of 'stale data' bugs. We compare cache-aside, read/write-through and write-behind, then cover the Spring Cache and Redis setup, per-cache TTLs, invalidation strategies, stampede and consistency pitfalls and Redis operational settings.

Strangler fig diagram showing capabilities moved step by step to new modules through a gateway in front of the old system

Legacy Software Modernization: Rewrite or Strangler Fig?

'Let's rewrite the system from scratch' is the most expensive and most regretted decision in enterprise software. We compare five modernization approaches on risk, time and cost, then walk through the strangler fig pattern that makes a no-downtime transition possible, together with the hardest part: the data-layer strategy.

Diagram showing webhook delivery from provider to consumer, signature verification and the retry loop

Webhook Design: Signatures, Retries, Ordering, Idempotency

A webhook is the reverse of an API: you don't poll, the other side calls you — and the network, timeouts, redelivery and out-of-order events become your problem. The design that works in production on both sides: event envelope, HMAC signature, retry schedule and outbox for the provider; verification, fast 200 and async idempotent processing for the consumer.

Diagram comparing the database-per-tenant, schema-per-tenant and shared-table models

Multi-Tenant SaaS Architecture: Database, Schema, Row-Level

Tenant isolation is the most expensive architectural decision to change later in a SaaS product. We compare database-per-tenant, schema-per-tenant and row-level (tenant_id) models on isolation, cost and operations, then cover the tenant context in Spring Boot and Hibernate, PostgreSQL RLS as a second line of defense and the mistakes we see in the field.

RAG architecture diagram showing the ingestion, vector store, retrieval and LLM steps

RAG Architecture: Q&A Over Your Company Documents

The technical answer to 'let's connect ChatGPT to our company documents' is RAG: documents are chunked and embedded, and the chunks closest to the question are handed to the model as context. The ingestion pipeline, embedding choice for non-English content, hybrid search and reranking, access control and the evaluation set, with Spring AI examples.

State diagram showing the transitions between a circuit breaker's closed, open and half-open states

Circuit Breaker, Retry and Bulkhead with Resilience4j

A slow downstream service can fill the thread pool and take the whole application down; resilience patterns break that chain. Resilience4j's circuit breaker, retry, bulkhead, time limiter and rate limiter modules, configuration values that work in production, fallback strategies and common mistakes, with Spring Boot code.