From 2b5009f864887ed35c1a572897982d30143c7978 Mon Sep 17 00:00:00 2001 From: gahusb Date: Wed, 13 May 2026 22:12:01 +0900 Subject: [PATCH] fix(sqlite): WAL + busy_timeout 120s standardized across all labs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 8개 lab의 _conn() 함수에 표준 동시성 패턴 통일: - timeout=120.0 (connection 획득) - PRAGMA journal_mode=WAL (reader/writer 분리) - PRAGMA busy_timeout=120000 (트랜잭션 충돌 시 120초 대기) stock-lab/screener/router.py 의 검증된 패턴(d9b6122) 을 lotto, stock-lab(메인), music-lab, blog-lab, realestate-lab, agent-office, personal, travel-proxy 로 확산. 기존 'database is locked' 오류 윈도우를 흡수. Co-Authored-By: Claude Opus 4.7 (1M context) --- agent-office/app/db.py | 3 ++- blog-lab/app/db.py | 3 ++- lotto/app/db.py | 4 +++- music-lab/app/db.py | 4 +++- personal/app/db.py | 3 ++- realestate-lab/app/db.py | 3 ++- stock-lab/app/db.py | 4 +++- travel-proxy/app/db.py | 3 ++- 8 files changed, 19 insertions(+), 8 deletions(-) diff --git a/agent-office/app/db.py b/agent-office/app/db.py index 392d087..81f95d7 100644 --- a/agent-office/app/db.py +++ b/agent-office/app/db.py @@ -9,9 +9,10 @@ from .config import DB_PATH def _conn() -> sqlite3.Connection: os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - conn = sqlite3.connect(DB_PATH, timeout=10) + conn = sqlite3.connect(DB_PATH, timeout=120.0) conn.row_factory = sqlite3.Row conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA busy_timeout=120000") return conn diff --git a/blog-lab/app/db.py b/blog-lab/app/db.py index 79e1ab5..a531ad0 100644 --- a/blog-lab/app/db.py +++ b/blog-lab/app/db.py @@ -8,9 +8,10 @@ from .config import DB_PATH def _conn() -> sqlite3.Connection: os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - conn = sqlite3.connect(DB_PATH) + conn = sqlite3.connect(DB_PATH, timeout=120.0) conn.row_factory = sqlite3.Row conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA busy_timeout=120000") return conn diff --git a/lotto/app/db.py b/lotto/app/db.py index 32bae14..ae9f678 100644 --- a/lotto/app/db.py +++ b/lotto/app/db.py @@ -9,8 +9,10 @@ DB_PATH = "/app/data/lotto.db" def _conn() -> sqlite3.Connection: os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - conn = sqlite3.connect(DB_PATH) + conn = sqlite3.connect(DB_PATH, timeout=120.0) conn.row_factory = sqlite3.Row + conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA busy_timeout=120000") return conn def _ensure_column(conn: sqlite3.Connection, table: str, col: str, ddl: str) -> None: diff --git a/music-lab/app/db.py b/music-lab/app/db.py index 06b4077..45fa4c5 100644 --- a/music-lab/app/db.py +++ b/music-lab/app/db.py @@ -9,8 +9,10 @@ DB_PATH = "/app/data/music.db" def _conn() -> sqlite3.Connection: os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - conn = sqlite3.connect(DB_PATH) + conn = sqlite3.connect(DB_PATH, timeout=120.0) conn.row_factory = sqlite3.Row + conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA busy_timeout=120000") return conn diff --git a/personal/app/db.py b/personal/app/db.py index c91e5d7..a712223 100644 --- a/personal/app/db.py +++ b/personal/app/db.py @@ -9,9 +9,10 @@ DB_PATH = "/app/data/personal.db" def _conn(): - c = sqlite3.connect(DB_PATH, timeout=10) + c = sqlite3.connect(DB_PATH, timeout=120.0) c.row_factory = sqlite3.Row c.execute("PRAGMA journal_mode=WAL;") + c.execute("PRAGMA busy_timeout=120000;") c.execute("PRAGMA foreign_keys=ON;") return c diff --git a/realestate-lab/app/db.py b/realestate-lab/app/db.py index f3c41fc..d795b48 100644 --- a/realestate-lab/app/db.py +++ b/realestate-lab/app/db.py @@ -12,9 +12,10 @@ DB_PATH = os.getenv("REALESTATE_DB_PATH", "/app/data/realestate.db") def _conn(): - c = sqlite3.connect(DB_PATH, timeout=10) + c = sqlite3.connect(DB_PATH, timeout=120.0) c.row_factory = sqlite3.Row c.execute("PRAGMA journal_mode=WAL;") + c.execute("PRAGMA busy_timeout=120000;") c.execute("PRAGMA foreign_keys=ON;") return c diff --git a/stock-lab/app/db.py b/stock-lab/app/db.py index 4183a10..bfb50bf 100644 --- a/stock-lab/app/db.py +++ b/stock-lab/app/db.py @@ -12,8 +12,10 @@ def _conn() -> sqlite3.Connection: parent = os.path.dirname(db_path) if parent: os.makedirs(parent, exist_ok=True) - conn = sqlite3.connect(db_path) + conn = sqlite3.connect(db_path, timeout=120.0) conn.row_factory = sqlite3.Row + conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA busy_timeout=120000") return conn def init_db(): diff --git a/travel-proxy/app/db.py b/travel-proxy/app/db.py index 48d0462..9451d68 100644 --- a/travel-proxy/app/db.py +++ b/travel-proxy/app/db.py @@ -7,9 +7,10 @@ DB_PATH = os.getenv("TRAVEL_DB_PATH", "/data/thumbs/travel.db") def _conn() -> sqlite3.Connection: os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) - conn = sqlite3.connect(DB_PATH) + conn = sqlite3.connect(DB_PATH, timeout=120.0) conn.row_factory = sqlite3.Row conn.execute("PRAGMA journal_mode=WAL") + conn.execute("PRAGMA busy_timeout=120000") return conn