SQLite를 사용하는 환경에서 SQLITE_BUSY: database is locked 오류를 경험한 적이 있으신가요? 이 오류는 SQLite가 동시에 여러 쓰기 작업을 잘 처리하지 못하기 때문에 발생하며, 쓰기 작업 중에 읽기 작업이 차단되는 경우도 있습니다.
이 문제를 해결하는 간단하고 효과적인 방법은 Write-Ahead Logging (WAL) 모드를 활성화하는 것입니다. 이번 포스트에서는 Python과 Node.js에서 WAL 모드를 활성화하는 방법을 예제로 보여드리겠습니다.
WAL 모드란?
Write-Ahead Logging(WAL)은 SQLite의 동시성을 개선하는 모드입니다. WAL 모드를 사용하면 다음과 같은 장점이 있습니다:
- 동시 읽기/쓰기 허용: 하나의 쓰기와 여러 개의 읽기 작업이 동시에 가능합니다.
- 더 나은 성능: 쓰기 작업이 메인 데이터베이스 파일을 직접 수정하지 않고 별도의 WAL 파일에 기록됩니다.
- 간단한 전환: 데이터베이스에 한 줄의 명령어만 추가하면 됩니다.
1. Python에서 WAL 모드 활성화
아래는 Python 스크립트를 사용하여 WAL 모드를 활성화하는 예제입니다.
import sqlite3
# 데이터베이스 연결 열기
conn = sqlite3.connect('example.db')
# WAL 모드 활성화
conn.execute('PRAGMA journal_mode=WAL;')
print("WAL 모드가 활성화되었습니다.")
conn.close()
작동 방식:
- SQLite 데이터베이스 파일에 연결합니다.
- PRAGMA journal_mode=WAL; 명령어를 실행하여 WAL 모드를 활성화합니다.
- 연결을 종료합니다.
2. Node.js에서 WAL 모드 활성화
다음은 Node.js에서 WAL 모드를 활성화하는 코드입니다.
const sqlite3 = require('sqlite3').verbose();
// 데이터베이스 연결 열기
const db = new sqlite3.Database('example.db', (err) => {
if (err) {
console.error("데이터베이스 열기 실패:", err.message);
} else {
// WAL 모드 활성화
db.exec('PRAGMA journal_mode=WAL;', (err) => {
if (err) {
console.error("WAL 모드 활성화 실패:", err.message);
} else {
console.log("WAL 모드가 활성화되었습니다.");
}
});
}
});
작동 방식:
- SQLite의 sqlite3 모듈을 사용하여 데이터베이스에 연결합니다.
- db.exec()를 사용하여 PRAGMA journal_mode=WAL; 명령어를 실행합니다.
- 오류를 처리하고 WAL 모드가 활성화되었음을 확인합니다.
WAL 모드를 활성화해야 하는 이유
- 동시성 개선: 읽기 작업이 쓰기 작업에 의해 차단되지 않습니다.
- 성능 향상: 쓰기 작업이 WAL 파일에 기록되므로 데이터베이스 파일을 직접 수정하지 않습니다.
- 간편한 전환: 데이터베이스 파일에 한 번만 설정하면 지속적으로 WAL 모드가 활성화됩니다.
WAL 모드가 유용한 환경
- 동시 작업: 센서 데이터 수집, 다수의 사용자 요청을 처리하는 웹 애플리케이션 등.
- 배경 작업: 데이터를 SQLite에 저장하면서 MySQL과 같은 외부 서버로 업로드해야 하는 경우.
추가 팁
- WAL 모드 지속성: 한 번 활성화하면 데이터베이스 파일에 영구적으로 적용됩니다(명시적으로 비활성화하지 않는 한).
- SQLite 버전 확인: WAL 모드는 SQLite 3.7.0 이상에서 지원됩니다.
- 잠금 문제 해결: WAL 모드를 사용해도 다른 애플리케이션이 SQLite 파일을 잠그는 경우 오류가 발생할 수 있습니다. 이러한 경우 접근 동기화가 필요합니다.
결론
WAL 모드를 활성화하면 SQLITE_BUSY 오류를 방지하고 SQLite의 동시성을 크게 개선할 수 있습니다. Python과 Node.js에서 제공된 예제 코드를 활용하여 WAL 모드를 손쉽게 활성화해 보세요. SQLite가 더욱 강력한 데이터베이스로 변모할 것입니다!
여러분의 프로젝트에서 WAL 모드가 어떻게 도움이 되었는지 댓글로 공유해주세요!
'데이터 베이스' 카테고리의 다른 글
오래된 안드로이드 폰을 Termux로 개인 데이터베이스 서버로 전환하기 (0) | 2024.12.16 |
---|---|
데이터 베이스란(Database / DB) ? (3) | 2023.10.10 |
댓글