인메모리 데이터베이스
인메모리 데이터베이스 (In-Memory Databases)
SQLite 데이터베이스는 보통 하나의 일반적인 디스크 파일에 저장돼요. 그러나 특정 상황에서는 데이터베이스가 메모리에 저장될 수 있어요.
본문
SQLite 데이터베이스가 순수하게 메모리에만 존재하도록 강제하는 가장 일반적인 방법은 특수 파일 이름 ":memory:"를 사용해 데이터베이스를 여는 것이에요. 다시 말해, sqlite3_open(), sqlite3_open16(), sqlite3_open_v2() 함수 중 하나에 실제 디스크 파일 이름을 전달하는 대신 ":memory:" 문자열을 전달해요. 예를 들어:
rc = sqlite3_open(":memory:", &db);
이렇게 하면 디스크 파일이 열리지 않아요. 대신 순수하게 메모리에만 존재하는 새 데이터베이스가 만들어져요. 데이터베이스 연결이 닫히는 즉시 그 데이터베이스는 사라져요. 각각의 :memory: 데이터베이스는 다른 모든 것과 구별돼요. 따라서 파일 이름 ":memory:"로 각각 열린 두 개의 데이터베이스 연결은 서로 독립적인 두 개의 인메모리 데이터베이스를 만들게 돼요.
특수 파일 이름 ":memory:"는 데이터베이스 파일 이름이 허용되는 어디에서든 사용할 수 있어요. 예를 들어 ATTACH 명령에서 _filename_으로 사용할 수 있어요:
ATTACH DATABASE ':memory:' AS aux1;
특수 ":memory:" 이름이 적용되어 순수 인메모리 데이터베이스가 만들어지려면 파일 이름에 추가 텍스트가 없어야 한다는 점에 유의하세요. 따라서 디스크 기반 데이터베이스는 다음과 같이 경로명을 앞에 붙여 파일로 만들 수 있어요: "./:memory:".
특수 ":memory:" 파일 이름은 URI 파일 이름을 사용할 때도 작동해요. 예를 들어:
rc = sqlite3_open("file::memory:", &db);
또는
ATTACH DATABASE 'file::memory:' AS aux1;
인메모리 데이터베이스와 공유 캐시 (In-memory Databases And Shared Cache)
인메모리 데이터베이스는 URI 파일 이름을 사용해 열면 공유 캐시 (shared cache)를 사용할 수 있어요. 꾸미지 않은 ":memory:" 이름이 인메모리 데이터베이스를 지정하는 데 사용되면, 그 데이터베이스는 항상 개인 캐시를 가지며 원래 열었던 데이터베이스 연결에만 보여요. 하지만 같은 인메모리 데이터베이스를 두 개 이상의 데이터베이스 연결이 다음과 같이 열 수 있어요:
rc = sqlite3_open("file::memory:?cache=shared", &db);
또는
ATTACH DATABASE 'file::memory:?cache=shared' AS aux1;
이렇게 하면 서로 다른 데이터베이스 연결이 같은 인메모리 데이터베이스를 공유할 수 있어요. 물론 인메모리 데이터베이스를 공유하는 모든 데이터베이스 연결은 같은 프로세스 안에 있어야 해요. 데이터베이스에 대한 마지막 연결이 닫히면 데이터베이스는 자동으로 삭제되고 메모리는 회수돼요.
단일 프로세스에서 두 개 이상의 서로 다르지만 공유 가능한 인메모리 데이터베이스가 필요하면, mode=memory 쿼리 매개변수를 URI 파일 이름과 함께 사용해 이름이 있는 인메모리 데이터베이스를 만들 수 있어요:
rc = sqlite3_open("file:memdb1?mode=memory&cache=shared", &db);
또는
ATTACH DATABASE 'file:memdb1?mode=memory&cache=shared' AS aux1;
인메모리 데이터베이스가 이런 방식으로 이름이 지정되면, 정확히 같은 이름을 사용하는 다른 연결하고만 캐시를 공유해요.
임시 데이터베이스 (Temporary Databases)
sqlite3_open() 또는 ATTACH에 전달되는 데이터베이스 파일의 이름이 빈 문자열이면, 데이터베이스를 담을 새 임시 파일이 만들어져요.
rc = sqlite3_open("", &db);
ATTACH DATABASE '' AS aux2;
매번 다른 임시 파일이 만들어져서, 특수 ":memory:" 문자열과 마찬가지로 임시 데이터베이스에 대한 두 개의 데이터베이스 연결은 각각 자신의 개인 데이터베이스를 가져요. 임시 데이터베이스는 그것을 만든 연결이 닫힐 때 자동으로 삭제돼요.
각 임시 데이터베이스에 디스크 파일이 할당되지만, 실제로 임시 데이터베이스는 보통 인메모리 페이지 캐시에 존재하므로 ":memory:"가 만든 순수 인메모리 데이터베이스와 빈 파일 이름이 만든 임시 데이터베이스 사이에는 차이가 거의 없어요. 유일한 차이는 ":memory:" 데이터베이스는 항상 메모리에 남아 있어야 하지만, 임시 데이터베이스는 데이터베이스가 커지거나 SQLite가 메모리 압박을 받게 되면 일부가 디스크로 쫓겨날(flush) 수 있다는 점이에요.
지금까지의 단락들은 기본 SQLite 설정에서의 임시 데이터베이스 동작을 설명한 것이에요. 애플리케이션은 원한다면 temp_store pragma와 SQLITE_TEMP_STORE 컴파일 타임 매개변수를 사용해 임시 데이터베이스가 순수 인메모리 데이터베이스처럼 동작하도록 강제할 수 있어요.