<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Viktar Patotski’s Blog</title><description>Senior independent consulting for vertical SaaS: AWS cost optimization, performance engineering, scale readiness, AI enablement, security &amp; compliance. 20+ years.</description><link>https://patotski.com/</link><item><title>Postgres Row-Level Security for Multi-Tenancy: The Pattern and the Footguns</title><link>https://patotski.com/blog/postgres-row-level-security-multi-tenant/</link><guid isPermaLink="true">https://patotski.com/blog/postgres-row-level-security-multi-tenant/</guid><description>Row-Level Security moves tenant isolation out of every developer&apos;s memory and into the database itself. Here is the exact Postgres pattern for a pooled multi-tenant app, plus the four footguns that leak data in production if you miss them.</description><pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Single-Tenant vs Multi-Tenant: The Decision Is Usually Both</title><link>https://patotski.com/blog/single-tenant-vs-multi-tenant/</link><guid isPermaLink="true">https://patotski.com/blog/single-tenant-vs-multi-tenant/</guid><description>The question is not which one wins, it is where you draw the isolation boundary. Here is how single and multi-tenant differ on cost, isolation, compliance, and ops, and why most SaaS that scales ends up running both at once.</description><pubDate>Sat, 04 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Multi-Tenant Architecture for Vertical SaaS: Pick the Model on Purpose</title><link>https://patotski.com/blog/multi-tenant-architecture/</link><guid isPermaLink="true">https://patotski.com/blog/multi-tenant-architecture/</guid><description>Silo, pool, or bridge is one of the few architecture choices you cannot cheaply reverse. Here are the three models in plain terms, how they map to a real database, and a decision framework so you pick the one your customers and your margins actually need.</description><pubDate>Fri, 03 Jul 2026 00:00:00 GMT</pubDate></item><item><title>AWS Cost Explorer: How to Actually Read Your Bill</title><link>https://patotski.com/blog/aws-cost-explorer-read-your-bill/</link><guid isPermaLink="true">https://patotski.com/blog/aws-cost-explorer-read-your-bill/</guid><description>Your AWS bill is not a mystery, you just have not grouped it right. Cost Explorer is free and shows you where every dollar goes in about fifteen minutes. Here is the exact drill-down, which cost view to trust, and the one free alarm to set before you close the tab.</description><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate></item><item><title>AWS Graviton: The 20% Cost Cut Most Teams Leave on the Table</title><link>https://patotski.com/blog/aws-graviton-migration/</link><guid isPermaLink="true">https://patotski.com/blog/aws-graviton-migration/</guid><description>Graviton instances cost up to 20% less than the x86 equivalent for the same work. On managed services it is a setting you flip. On your own compute it is a real migration with real gotchas. Here is which workloads move for free, which take effort, and which cannot move at all.</description><pubDate>Wed, 01 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Amazon Aurora Cost: Where It Saves You and Where It Quietly Burns You</title><link>https://patotski.com/blog/amazon-aurora-cost/</link><guid isPermaLink="true">https://patotski.com/blog/amazon-aurora-cost/</guid><description>Aurora can be cheaper than RDS or twice the price, and the deciding line item is the one nobody watches: I/O. Here is how the bill is built, when I/O-Optimized and Serverless v2 actually save money, and the traps that turn a managed database into your biggest surprise.</description><pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate></item><item><title>AWS Savings Plans vs Reserved Instances: Which One Actually Cuts Your Bill</title><link>https://patotski.com/blog/aws-savings-plans-vs-reserved-instances/</link><guid isPermaLink="true">https://patotski.com/blog/aws-savings-plans-vs-reserved-instances/</guid><description>Both trade a commitment for a discount, but they are not interchangeable. Savings Plans buy flexibility, Reserved Instances buy the deepest rate, and the data tier plays by its own rules. Here is how to pick without locking up capital you will regret.</description><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate></item><item><title>AWS Data Transfer Costs: Where the Money Leaks and How to Cut It</title><link>https://patotski.com/blog/aws-data-transfer-costs/</link><guid isPermaLink="true">https://patotski.com/blog/aws-data-transfer-costs/</guid><description>AWS charges to move bytes based on where they go. The expensive surprises are not the internet egress everyone expects, they are the cross-AZ chatter you cannot see. Here is the full rate ladder and the cheapest ways to cut the bill.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate></item><item><title>AWS NAT Gateway Pricing: The Hidden Cost Trap and How to Cut It</title><link>https://patotski.com/blog/nat-gateway-cost-trap/</link><guid isPermaLink="true">https://patotski.com/blog/nat-gateway-cost-trap/</guid><description>A NAT gateway charges you twice: an hourly fee per gateway and a per-GB processing fee on every byte through it, often on top of normal data transfer. Here is where the money leaks and the cheapest ways to stop it.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Database Optimization: Find the Bottleneck, Fix the Cheapest Thing First</title><link>https://patotski.com/blog/database-optimization/</link><guid isPermaLink="true">https://patotski.com/blog/database-optimization/</guid><description>Most database optimization guides hand you a list of ten techniques and skip the one question that matters: which problem do you actually have? Here is the diagnosis-first version. Find the real bottleneck, then apply the cheapest fix that clears it.</description><pubDate>Sun, 28 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Redis Caching vs a Local In-Memory Cache: When You Actually Need the Network Hop</title><link>https://patotski.com/blog/redis-caching-vs-local-cache/</link><guid isPermaLink="true">https://patotski.com/blog/redis-caching-vs-local-cache/</guid><description>A cache is the reflex after you fix the slow query. The real decision is where it lives. A local in-memory cache is faster and simpler than Redis until you run more than one instance, and then it quietly serves stale data. Here is how to pick.</description><pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The Database Scaling Ladder: Every Cheaper Fix Before You Shard</title><link>https://patotski.com/blog/database-scaling-ladder/</link><guid isPermaLink="true">https://patotski.com/blog/database-scaling-ladder/</guid><description>Most teams reach for sharding years before they need it. There is a ladder of cheaper, lower-risk fixes that comes first, and the right rung depends on which bottleneck you actually have: read load, write load, or data size. Here is the ladder, from cheapest to last resort.</description><pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Postgres vs MySQL in 2026: Which to Pick for a SaaS (and When to Switch)</title><link>https://patotski.com/blog/postgres-vs-mysql/</link><guid isPermaLink="true">https://patotski.com/blog/postgres-vs-mysql/</guid><description>Both are excellent databases and for most SaaS workloads either one is fine. The honest answer: pick Postgres for greenfield, keep what you run well, and switch only for a reason you can name. Here are the few differences that actually decide it.</description><pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Database Indexes That Actually Help (and the Ones Quietly Hurting You)</title><link>https://patotski.com/blog/database-indexing-that-actually-helps/</link><guid isPermaLink="true">https://patotski.com/blog/database-indexing-that-actually-helps/</guid><description>Most slow-query problems are not a missing index, they are the wrong index, or ten indexes nobody needs. Start from the query plan, build the index the query actually wants, and drop the ones taxing every write.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Model Access Just Became a Supply-Chain Risk</title><link>https://patotski.com/blog/model-access-supply-chain-risk/</link><guid isPermaLink="true">https://patotski.com/blog/model-access-supply-chain-risk/</guid><description>A government directive can now switch off your AI provider overnight - and pricing, deprecation, and policy could always do it. If a core feature depends on one model API you don&apos;t control, that&apos;s a single point of failure. Here&apos;s how to treat model access like any other supply-chain risk.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate></item><item><title>How to Reduce AWS RDS Costs Without Hurting Performance</title><link>https://patotski.com/blog/reduce-aws-rds-costs/</link><guid isPermaLink="true">https://patotski.com/blog/reduce-aws-rds-costs/</guid><description>RDS is often the second or third biggest line on an AWS bill, sometimes the first, and most of it is avoidable. The levers that move it: fix the queries before you upsize, match the instance to your load shape, and stop provisioning storage for data that has not arrived yet.</description><pubDate>Sun, 14 Jun 2026 00:00:00 GMT</pubDate></item><item><title>The Business Case for Software Performance: Six Ways Speed Makes You Money</title><link>https://patotski.com/blog/business-case-for-software-performance/</link><guid isPermaLink="true">https://patotski.com/blog/business-case-for-software-performance/</guid><description>One product I worked on went from 8-second page loads to 500ms and conversion doubled. Performance is a P&amp;L line. Here&apos;s the money math and what it means for SaaS.</description><pubDate>Thu, 11 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Spring Boot on the JVM vs GraalVM Native: What Actually Wins on AWS</title><link>https://patotski.com/blog/spring-boot-jvm-vs-graalvm-native-benchmark/</link><guid isPermaLink="true">https://patotski.com/blog/spring-boot-jvm-vs-graalvm-native-benchmark/</guid><description>A head-to-head benchmark of the same Spring Boot app built for the JVM and as a GraalVM native binary - on real AWS hardware with a real database, run multiple times. Native wins startup, memory, and predictability; the warm JVM wins the median, peak throughput, and often the tail too - but the JVM swings run-to-run while native stays flat.</description><pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate></item><item><title>Spring Boot 3 Migration Guide: javax to jakarta with OpenRewrite (and the sed Trap)</title><link>https://patotski.com/blog/spring-boot-3-javax-to-jakarta/</link><guid isPermaLink="true">https://patotski.com/blog/spring-boot-3-javax-to-jakarta/</guid><description>Migrate Spring Boot 2 to 3: the javax to jakarta package rename. Why the one-line sed trick quietly breaks javax.sql and javax.crypto, which packages actually move, and how OpenRewrite does the whole upgrade safely. Tested on real apps.</description><pubDate>Sat, 26 Nov 2022 00:00:00 GMT</pubDate></item><item><title>Liquibase &apos;Could Not Acquire Change Log Lock&apos; - Permanent Fix With Session Locks</title><link>https://patotski.com/blog/liquibase-database-lock-permanent-solution/</link><guid isPermaLink="true">https://patotski.com/blog/liquibase-database-lock-permanent-solution/</guid><description>Stop the recurring &quot;could not acquire change log lock&quot; error in Liquibase. Replace databasechangeloglock with Postgres session locks - auto-releases on connection drop, no manual unlock.</description><pubDate>Wed, 15 Jun 2022 00:00:00 GMT</pubDate></item><item><title>How To: Find top used shell commands (Linux, macOS)</title><link>https://patotski.com/blog/find-top-used-shell-commands/</link><guid isPermaLink="true">https://patotski.com/blog/find-top-used-shell-commands/</guid><description>How to find top used shell commands in Linux of macOS terminal.</description><pubDate>Sat, 27 Feb 2021 00:00:00 GMT</pubDate></item><item><title>Spring: Autowire All Beans of an Interface (List, Set, Map)</title><link>https://patotski.com/blog/autowiring-collection-of-beans-in-spring/</link><guid isPermaLink="true">https://patotski.com/blog/autowiring-collection-of-beans-in-spring/</guid><description>Inject every Spring bean implementing an interface into one field: a List or array (ordered with @Order), a Set, or a Map&lt;String, T&gt; keyed by bean name. Working code for each.</description><pubDate>Tue, 23 Feb 2021 00:00:00 GMT</pubDate></item><item><title>Why should you write unit tests</title><link>https://patotski.com/blog/reasons-to-write-unit-tests/</link><guid isPermaLink="true">https://patotski.com/blog/reasons-to-write-unit-tests/</guid><description>Find reasoning and motivation to write unit tests for your application.</description><pubDate>Sat, 13 Feb 2021 00:00:00 GMT</pubDate></item><item><title>How To: Create a directory tree with a single command (Linux, macOS)</title><link>https://patotski.com/blog/create-directory-tree-in-cli/</link><guid isPermaLink="true">https://patotski.com/blog/create-directory-tree-in-cli/</guid><description>Create tree folder structure with a single command</description><pubDate>Wed, 03 Feb 2021 00:00:00 GMT</pubDate></item><item><title>Lombok @RequiredArgsConstructor: Spring Boot Constructor Injection</title><link>https://patotski.com/blog/spring-boot-components-with-lombok/</link><guid isPermaLink="true">https://patotski.com/blog/spring-boot-components-with-lombok/</guid><description>Constructor injection in Spring Boot with Lombok @RequiredArgsConstructor: drop @Autowired, keep fields final, no boilerplate. Setup with Maven and Gradle.</description><pubDate>Sun, 31 Jan 2021 00:00:00 GMT</pubDate></item></channel></rss>