{"id":614,"date":"2024-04-17T10:00:00","date_gmt":"2024-04-17T10:00:00","guid":{"rendered":"https:\/\/jacar.es\/sqlite-en-produccion\/"},"modified":"2024-04-17T10:00:00","modified_gmt":"2024-04-17T10:00:00","slug":"sqlite-en-produccion","status":"publish","type":"post","link":"https:\/\/jacar.es\/en\/sqlite-en-produccion\/","title":{"rendered":"SQLite in Production: Not Just for Mobile"},"content":{"rendered":"<p>The myth: <strong>SQLite is for mobile apps and prototypes<\/strong>. Reality in 2024: thousands of production applications \u2014 from <strong>Tailscale<\/strong> to <strong>Fly.io<\/strong>, <strong>Expensify<\/strong>, or small SaaS \u2014 use it as main DB. The SQLite + WAL mode + Litestream + (optionally) LiteFS combination enables scaling beyond where many teams assume they need PostgreSQL. This article covers how, when, and its real limits.<\/p>\n<h2 id=\"why-server-side-sqlite-is-viable\">Why Server-Side SQLite Is Viable<\/h2>\n<p>Traditional SQLite assumptions are obsolete:<\/p>\n<ul>\n<li><strong>\u201cDoesn\u2019t scale\u201d: false<\/strong>. SQLite handles thousands of writes\/s and hundreds of thousands of reads\/s on modest hardware.<\/li>\n<li><strong>\u201cNo concurrent writes\u201d<\/strong>: historically true, but WAL mode mitigates much.<\/li>\n<li><strong>\u201cNo replication\u201d<\/strong>: Litestream, LiteFS, rqlite solve.<\/li>\n<li><strong>\u201cNo backup tool\u201d<\/strong>: Litestream streams to S3-compatible.<\/li>\n<\/ul>\n<p>For apps with 1 process \/ 1 instance, SQLite is spectacularly productive.<\/p>\n<h2 id=\"wal-mode-the-fundamental-change\">WAL Mode: The Fundamental Change<\/h2>\n<p>Write-Ahead Logging, enable with <code>PRAGMA journal_mode=WAL<\/code>:<\/p>\n<ul>\n<li><strong>Concurrent reads<\/strong> don\u2019t block writes.<\/li>\n<li><strong>Concurrent writes<\/strong> still serialise but with less contention.<\/li>\n<li><strong>Better durability<\/strong> vs traditional journal_mode.<\/li>\n<li><strong>Incremental checkpointing<\/strong> from WAL to DB.<\/li>\n<\/ul>\n<p>Almost every serious SQLite deployment uses WAL. It\u2019s the reasonable default.<\/p>\n<h2 id=\"productive-optimisations\">Productive Optimisations<\/h2>\n<p>Recommended pragmas for production:<\/p>\n<div class=\"sourceCode\" id=\"cb1\">\n<pre class=\"sourceCode sql\"><code class=\"sourceCode sql\"><span id=\"cb1-1\"><a href=\"#cb1-1\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>PRAGMA journal_mode <span class=\"op\">=<\/span> WAL;<\/span>\n<span id=\"cb1-2\"><a href=\"#cb1-2\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>PRAGMA synchronous <span class=\"op\">=<\/span> <span class=\"kw\">NORMAL<\/span>;  <span class=\"co\">-- vs FULL: durability\/perf trade-off<\/span><\/span>\n<span id=\"cb1-3\"><a href=\"#cb1-3\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>PRAGMA cache_size <span class=\"op\">=<\/span> <span class=\"op\">-<\/span><span class=\"dv\">64000<\/span>;   <span class=\"co\">-- 64MB<\/span><\/span>\n<span id=\"cb1-4\"><a href=\"#cb1-4\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>PRAGMA foreign_keys <span class=\"op\">=<\/span> <span class=\"kw\">ON<\/span>;<\/span>\n<span id=\"cb1-5\"><a href=\"#cb1-5\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>PRAGMA busy_timeout <span class=\"op\">=<\/span> <span class=\"dv\">5000<\/span>;   <span class=\"co\">-- 5s before SQLITE_BUSY<\/span><\/span>\n<span id=\"cb1-6\"><a href=\"#cb1-6\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>PRAGMA temp_store <span class=\"op\">=<\/span> MEMORY;<\/span>\n<span id=\"cb1-7\"><a href=\"#cb1-7\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>PRAGMA mmap_size <span class=\"op\">=<\/span> <span class=\"dv\">268435456<\/span>; <span class=\"co\">-- 256MB memory-mapped<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>3-10x performance differences vs defaults.<\/p>\n<h2 id=\"litestream-replication-to-s3\">Litestream: Replication to S3<\/h2>\n<p><strong><a href=\"https:\/\/litestream.io\/\">Litestream<\/a><\/strong> streams the WAL to S3 (or compatible) in near-realtime:<\/p>\n<div class=\"sourceCode\" id=\"cb2\">\n<pre class=\"sourceCode toml\"><code class=\"sourceCode toml\"><span id=\"cb2-1\"><a href=\"#cb2-1\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"co\"># \/etc\/litestream.yml<\/span><\/span>\n<span id=\"cb2-2\"><a href=\"#cb2-2\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"dt\">dbs<\/span><span class=\"er\">:<\/span><\/span>\n<span id=\"cb2-3\"><a href=\"#cb2-3\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>  <span class=\"dt\">-<\/span> <span class=\"dt\">path<\/span><span class=\"er\">:<\/span> <span class=\"er\">\/<\/span><span class=\"dt\">data<\/span><span class=\"er\">\/<\/span><span class=\"dt\">app.db<\/span><\/span>\n<span id=\"cb2-4\"><a href=\"#cb2-4\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>    <span class=\"dt\">replicas<\/span><span class=\"er\">:<\/span><\/span>\n<span id=\"cb2-5\"><a href=\"#cb2-5\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>      <span class=\"dt\">-<\/span> <span class=\"dt\">type<\/span><span class=\"er\">:<\/span> <span class=\"dt\">s3<\/span><\/span>\n<span id=\"cb2-6\"><a href=\"#cb2-6\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>        <span class=\"dt\">bucket<\/span><span class=\"er\">:<\/span> <span class=\"dt\">my-backups<\/span><\/span>\n<span id=\"cb2-7\"><a href=\"#cb2-7\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>        <span class=\"dt\">path<\/span><span class=\"er\">:<\/span> <span class=\"dt\">app.db<\/span><\/span>\n<span id=\"cb2-8\"><a href=\"#cb2-8\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>        <span class=\"dt\">region<\/span><span class=\"er\">:<\/span> <span class=\"dt\">eu-west-1<\/span><\/span>\n<span id=\"cb2-9\"><a href=\"#cb2-9\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>        <span class=\"dt\">access-key-id<\/span><span class=\"er\">:<\/span> <span class=\"er\">${<\/span><span class=\"dt\">AWS_ACCESS_KEY_ID<\/span><span class=\"er\">}<\/span><\/span>\n<span id=\"cb2-10\"><a href=\"#cb2-10\" aria-hidden=\"true\" tabindex=\"-1\"><\/a>        <span class=\"dt\">secret-access-key<\/span><span class=\"er\">:<\/span> <span class=\"er\">${<\/span><span class=\"dt\">AWS_SECRET_ACCESS_KEY<\/span><span class=\"er\">}<\/span><\/span><\/code><\/pre>\n<\/div>\n<p>Trivial restore:<\/p>\n<div class=\"sourceCode\" id=\"cb3\">\n<pre class=\"sourceCode bash\"><code class=\"sourceCode bash\"><span id=\"cb3-1\"><a href=\"#cb3-1\" aria-hidden=\"true\" tabindex=\"-1\"><\/a><span class=\"ex\">litestream<\/span> restore <span class=\"at\">-o<\/span> \/data\/app.db s3:\/\/my-backups\/app.db<\/span><\/code><\/pre>\n<\/div>\n<p>For productive backup, Litestream makes SQLite nearly comparable to Postgres in durability.<\/p>\n<h2 id=\"litefs-multi-node-replication\">LiteFS: Multi-Node Replication<\/h2>\n<p><strong><a href=\"https:\/\/fly.io\/docs\/litefs\/\">LiteFS<\/a><\/strong> (from Fly.io) goes further: <strong>full<\/strong> SQLite replication between nodes with FUSE filesystem.<\/p>\n<ul>\n<li><strong>Primary + replicas<\/strong>: writes to primary, reads on any node.<\/li>\n<li><strong>Strong consistency<\/strong> with leasing.<\/li>\n<li><strong>Automated failover<\/strong>.<\/li>\n<\/ul>\n<p>Useful for high-availability or global applications (Fly.io uses this for its own Postgres-clustering alternative).<\/p>\n<h2 id=\"rqlite-distributed-sqlite\">rqlite: Distributed SQLite<\/h2>\n<p><strong><a href=\"https:\/\/www.rqlite.io\/\">rqlite<\/a><\/strong> is another approach: SQLite with Raft for distributed consensus. More complex but full cluster.<\/p>\n<p>For cases of 3+ nodes with automatic failover and strict replication, rqlite is more robust than LiteFS.<\/p>\n<h2 id=\"real-cases\">Real Cases<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/tailscale.com\/\">Tailscale<\/a><\/strong>: coordination server in SQLite + Litestream.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/Expensify\/Bedrock\">Expensify<\/a><\/strong>: Bedrock (distributed wrapper) in SQLite, millions of users.<\/li>\n<li><strong><a href=\"https:\/\/pocketbase.io\/\">PocketBase<\/a><\/strong>: complete BaaS based on SQLite.<\/li>\n<li><strong><a href=\"https:\/\/linear.app\/\">Linear<\/a><\/strong> and <strong><a href=\"https:\/\/www.notion.so\/\">Notion<\/a><\/strong>: SQLite on client via WASM.<\/li>\n<\/ul>\n<p>Common pattern: one app node + local SQLite + Litestream offsite.<\/p>\n<h2 id=\"when-sqlite-beats-postgres\">When SQLite Beats Postgres<\/h2>\n<p>Cases where SQLite is better choice:<\/p>\n<ul>\n<li><strong>1-process app<\/strong> (single instance VM, monolithic Lambda).<\/li>\n<li><strong>Simple to moderate queries<\/strong>, no cross-server joins.<\/li>\n<li><strong>Data volume<\/strong> up to ~100GB comfortably, ~1TB with discipline.<\/li>\n<li><strong>Zero latency<\/strong> to DB (same process).<\/li>\n<li><strong>Simple deployment<\/strong> (no separate DB server).<\/li>\n<li><strong>Backup as file cp<\/strong>.<\/li>\n<\/ul>\n<h2 id=\"when-sqlite-isnt-enough\">When SQLite Isn\u2019t Enough<\/h2>\n<p>Honesty:<\/p>\n<ul>\n<li><strong>Multiple writing processes<\/strong>: write serialisation is bottleneck.<\/li>\n<li><strong>Multiple app instances<\/strong>: can\u2019t shard SQLite between servers without complexity.<\/li>\n<li><strong>Massive analytical queries<\/strong>: use DuckDB (SQLite is OLTP, DuckDB is OLAP).<\/li>\n<li><strong>Postgres-specific extensions<\/strong> (serious pgvector, PostGIS, etc).<\/li>\n<li><strong>DB-level roles\/permissions<\/strong>: SQLite doesn\u2019t have.<\/li>\n<\/ul>\n<h2 id=\"write-concurrency\">Write Concurrency<\/h2>\n<p>For write-heavy apps, SQLite has a global write lock. Strategies:<\/p>\n<ul>\n<li><strong>Batching writes<\/strong>: small grouped transactions.<\/li>\n<li><strong>BEGIN IMMEDIATE<\/strong> for upgrade to write lock before retry-pain.<\/li>\n<li><strong>App-level queue<\/strong>: single writer processing requests.<\/li>\n<li><strong>Segregation<\/strong>: write-heavy data in DB separate from read-heavy.<\/li>\n<\/ul>\n<p>For ~1000 sustained writes\/s, SQLite handles. &gt;10k sustained, consider Postgres.<\/p>\n<h2 id=\"migrations\">Migrations<\/h2>\n<p>Use <strong><a href=\"https:\/\/sqlc.dev\/\">sqlc<\/a><\/strong> (Go), <strong><a href=\"https:\/\/github.com\/launchbadge\/sqlx\">SQLx<\/a><\/strong> (Rust), <strong><a href=\"https:\/\/github.com\/WiseLibs\/better-sqlite3\">better-sqlite3<\/a><\/strong> (Node). Tooling comparable to Postgres.<\/p>\n<p>For schema migrations:<\/p>\n<ul>\n<li><strong><a href=\"https:\/\/github.com\/pressly\/goose\">Goose<\/a><\/strong>, <strong><a href=\"https:\/\/github.com\/golang-migrate\/migrate\">golang-migrate<\/a><\/strong>: work.<\/li>\n<li><strong><a href=\"https:\/\/atlasgo.io\/\">atlas<\/a><\/strong>: modern, multi-DB.<\/li>\n<\/ul>\n<p>Specific SQL differences (types, ALTER TABLE limitations) require care.<\/p>\n<h2 id=\"useful-extensions\">Useful Extensions<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/github.com\/asg017\/sqlite-vss\">sqlite-vss<\/a><\/strong>: vector search.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/asg017\/sqlite-http\">sqlite-http<\/a><\/strong>: HTTP calls from SQL.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/nalgeon\/sqlean\">sqlean<\/a><\/strong>: popular extensions library.<\/li>\n<li><strong><a href=\"https:\/\/www.gaia-gis.it\/fossil\/libspatialite\">SpatiaLite<\/a><\/strong>: geospatial.<\/li>\n<\/ul>\n<p>Recent ecosystem growth is strong.<\/p>\n<h2 id=\"encryption\">Encryption<\/h2>\n<ul>\n<li><strong><a href=\"https:\/\/www.sqlite.org\/see\/\">SQLite Encryption Extension (SEE)<\/a><\/strong>: paid, official.<\/li>\n<li><strong><a href=\"https:\/\/www.zetetic.net\/sqlcipher\/\">SQLCipher<\/a><\/strong>: open-source, widely used.<\/li>\n<li><strong><a href=\"https:\/\/github.com\/utelle\/SQLite3MultipleCiphers\">sqlite3mc<\/a><\/strong>: multiple-ciphers.<\/li>\n<\/ul>\n<p>For at-rest sensitive data, these tools are mature.<\/p>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>SQLite is a serious option for 1-instance production applications. With WAL mode, optimised pragmas, Litestream, and optionally LiteFS or rqlite for HA, it covers cases many teams assume require PostgreSQL. The operational advantage is huge: no DB server, no network, no permissions, no complex backup. For massive write-heavy loads or multi-instance-writing, Postgres remains correct. But for the huge majority of small-to-medium apps, starting with SQLite and growing to Postgres only if really needed is a pragmatic strategy.<\/p>\n<p>Follow us on jacar.es for more on SQLite, databases, and simple architectures.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>SQLite on servers is more viable than you think. WAL, Litestream, LiteFS, and patterns enabling scale beyond where many Postgres deployments stop.<\/p>\n","protected":false},"author":1,"featured_media":615,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,25],"tags":[436,435,434,142,322,433],"class_list":["post-614","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arquitectura","category-desarrollo-de-software","tag-embedded-db","tag-litefs","tag-litestream","tag-serverless","tag-sqlite","tag-wal"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"en","enabled_languages":["es","en"],"languages":{"es":{"title":true,"content":true,"excerpt":true},"en":{"title":true,"content":true,"excerpt":true}}},"gutentor_comment":0,"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>SQLite in Production: Not Just for Mobile - Jacar<\/title>\n<meta name=\"description\" content=\"SQLite in production: WAL, Litestream replication, LiteFS distribution, real limits, and when SQLite beats PostgreSQL.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/jacar.es\/sqlite-en-produccion\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SQLite in Production: Not Just for Mobile - Jacar\" \/>\n<meta property=\"og:description\" content=\"SQLite in production: WAL, Litestream replication, LiteFS distribution, real limits, and when SQLite beats PostgreSQL.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/jacar.es\/sqlite-en-produccion\/\" \/>\n<meta property=\"og:site_name\" content=\"Jacar\" \/>\n<meta property=\"article:published_time\" content=\"2024-04-17T10:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\/wp-content\/uploads\/2020\/09\/favicon.png\" \/>\n\t<meta property=\"og:image:width\" content=\"252\" \/>\n\t<meta property=\"og:image:height\" content=\"229\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"javi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"javi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/\"},\"author\":{\"name\":\"javi\",\"@id\":\"https:\\\/\\\/jacar.es\\\/#\\\/schema\\\/person\\\/54a7f7b4224b38fafc9866eb3e614208\"},\"headline\":\"SQLite in Production: Not Just for Mobile\",\"datePublished\":\"2024-04-17T10:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/\"},\"wordCount\":1381,\"publisher\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/20035123\\\/jwp-1546227-18089.jpg\",\"keywords\":[\"embedded db\",\"litefs\",\"litestream\",\"serverless\",\"sqlite\",\"wal\"],\"articleSection\":[\"Arquitectura\",\"Desarrollo de Software\"],\"inLanguage\":\"en-US\"},{\"@type\":[\"WebPage\",\"ItemPage\"],\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/\",\"url\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/\",\"name\":\"SQLite in Production: Not Just for Mobile - Jacar\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/20035123\\\/jwp-1546227-18089.jpg\",\"datePublished\":\"2024-04-17T10:00:00+00:00\",\"description\":\"SQLite in production: WAL, Litestream replication, LiteFS distribution, real limits, and when SQLite beats PostgreSQL.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/#primaryimage\",\"url\":\"https:\\\/\\\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/20035123\\\/jwp-1546227-18089.jpg\",\"contentUrl\":\"https:\\\/\\\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\\\/wp-content\\\/uploads\\\/2024\\\/04\\\/20035123\\\/jwp-1546227-18089.jpg\",\"width\":1200,\"height\":800,\"caption\":\"Tarjeta de memoria SSD en primer plano sobre superficie oscura representando almacenamiento persistente\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jacar.es\\\/sqlite-en-produccion\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/jacar.es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SQLite en producci\u00f3n: no es solo para m\u00f3viles\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jacar.es\\\/#website\",\"url\":\"https:\\\/\\\/jacar.es\\\/\",\"name\":\"Jacar\",\"description\":\"Passion for Technology\",\"publisher\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/jacar.es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/jacar.es\\\/#organization\",\"name\":\"Jacar\",\"url\":\"https:\\\/\\\/jacar.es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/jacar.es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/jacar.es\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/favicon.png\",\"contentUrl\":\"https:\\\/\\\/jacar.es\\\/wp-content\\\/uploads\\\/2020\\\/09\\\/favicon.png\",\"width\":252,\"height\":229,\"caption\":\"Jacar\"},\"image\":{\"@id\":\"https:\\\/\\\/jacar.es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.linkedin.com\\\/in\\\/javiercanetearroyo\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/jacar.es\\\/#\\\/schema\\\/person\\\/54a7f7b4224b38fafc9866eb3e614208\",\"name\":\"javi\",\"sameAs\":[\"https:\\\/\\\/jacar.es\"],\"url\":\"https:\\\/\\\/jacar.es\\\/en\\\/author\\\/javi\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"SQLite in Production: Not Just for Mobile - Jacar","description":"SQLite in production: WAL, Litestream replication, LiteFS distribution, real limits, and when SQLite beats PostgreSQL.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/jacar.es\/sqlite-en-produccion\/","og_locale":"en_US","og_type":"article","og_title":"SQLite in Production: Not Just for Mobile - Jacar","og_description":"SQLite in production: WAL, Litestream replication, LiteFS distribution, real limits, and when SQLite beats PostgreSQL.","og_url":"https:\/\/jacar.es\/sqlite-en-produccion\/","og_site_name":"Jacar","article_published_time":"2024-04-17T10:00:00+00:00","og_image":[{"width":252,"height":229,"url":"https:\/\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\/wp-content\/uploads\/2020\/09\/favicon.png","type":"image\/png"}],"author":"javi","twitter_card":"summary_large_image","twitter_misc":{"Written by":"javi","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/jacar.es\/sqlite-en-produccion\/#article","isPartOf":{"@id":"https:\/\/jacar.es\/sqlite-en-produccion\/"},"author":{"name":"javi","@id":"https:\/\/jacar.es\/#\/schema\/person\/54a7f7b4224b38fafc9866eb3e614208"},"headline":"SQLite in Production: Not Just for Mobile","datePublished":"2024-04-17T10:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/jacar.es\/sqlite-en-produccion\/"},"wordCount":1381,"publisher":{"@id":"https:\/\/jacar.es\/#organization"},"image":{"@id":"https:\/\/jacar.es\/sqlite-en-produccion\/#primaryimage"},"thumbnailUrl":"https:\/\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\/wp-content\/uploads\/2024\/04\/20035123\/jwp-1546227-18089.jpg","keywords":["embedded db","litefs","litestream","serverless","sqlite","wal"],"articleSection":["Arquitectura","Desarrollo de Software"],"inLanguage":"en-US"},{"@type":["WebPage","ItemPage"],"@id":"https:\/\/jacar.es\/sqlite-en-produccion\/","url":"https:\/\/jacar.es\/sqlite-en-produccion\/","name":"SQLite in Production: Not Just for Mobile - Jacar","isPartOf":{"@id":"https:\/\/jacar.es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/jacar.es\/sqlite-en-produccion\/#primaryimage"},"image":{"@id":"https:\/\/jacar.es\/sqlite-en-produccion\/#primaryimage"},"thumbnailUrl":"https:\/\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\/wp-content\/uploads\/2024\/04\/20035123\/jwp-1546227-18089.jpg","datePublished":"2024-04-17T10:00:00+00:00","description":"SQLite in production: WAL, Litestream replication, LiteFS distribution, real limits, and when SQLite beats PostgreSQL.","breadcrumb":{"@id":"https:\/\/jacar.es\/sqlite-en-produccion\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/jacar.es\/sqlite-en-produccion\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jacar.es\/sqlite-en-produccion\/#primaryimage","url":"https:\/\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\/wp-content\/uploads\/2024\/04\/20035123\/jwp-1546227-18089.jpg","contentUrl":"https:\/\/jcs-wp-jacar-es.fsn1.your-objectstorage.com\/wp-content\/uploads\/2024\/04\/20035123\/jwp-1546227-18089.jpg","width":1200,"height":800,"caption":"Tarjeta de memoria SSD en primer plano sobre superficie oscura representando almacenamiento persistente"},{"@type":"BreadcrumbList","@id":"https:\/\/jacar.es\/sqlite-en-produccion\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/jacar.es\/"},{"@type":"ListItem","position":2,"name":"SQLite en producci\u00f3n: no es solo para m\u00f3viles"}]},{"@type":"WebSite","@id":"https:\/\/jacar.es\/#website","url":"https:\/\/jacar.es\/","name":"Jacar","description":"Passion for Technology","publisher":{"@id":"https:\/\/jacar.es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/jacar.es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/jacar.es\/#organization","name":"Jacar","url":"https:\/\/jacar.es\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/jacar.es\/#\/schema\/logo\/image\/","url":"https:\/\/jacar.es\/wp-content\/uploads\/2020\/09\/favicon.png","contentUrl":"https:\/\/jacar.es\/wp-content\/uploads\/2020\/09\/favicon.png","width":252,"height":229,"caption":"Jacar"},"image":{"@id":"https:\/\/jacar.es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/in\/javiercanetearroyo\/"]},{"@type":"Person","@id":"https:\/\/jacar.es\/#\/schema\/person\/54a7f7b4224b38fafc9866eb3e614208","name":"javi","sameAs":["https:\/\/jacar.es"],"url":"https:\/\/jacar.es\/en\/author\/javi\/"}]}},"_links":{"self":[{"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/posts\/614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/comments?post=614"}],"version-history":[{"count":0,"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/posts\/614\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/media\/615"}],"wp:attachment":[{"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/media?parent=614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/categories?post=614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jacar.es\/en\/wp-json\/wp\/v2\/tags?post=614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}