>  기사  >  백엔드 개발  >  SQLite 멀티스레딩 사용법에 대한 자세한 설명

SQLite 멀티스레딩 사용법에 대한 자세한 설명

Y2J
Y2J원래의
2017-05-11 11:39:281669검색

SQLite는 3가지 스레드 모드를 지원합니다.
단일 스레드: 이 모드에서는 상호 배제가 없으며 멀티스레딩은 안전하지 않습니다. 모든 뮤텍스 잠금을 비활성화하며 동시에 사용하면 오류가 발생합니다. SQLite를 컴파일할 때 SQLITE_THREADSAFE=0 매개변수를 추가하거나 SQLite를 초기화하기 전에 sqlite3_config(SQLITE_CONFIG_SINGLETHREAD)를 호출하면 활성화됩니다.

멀티스레딩: 이 모드에서는 여러 스레드가 동시에 사용하지 않는 한 데이터베이스 연결이 안전합니다. 소스 코드에서는 bCoreMutex가 활성화되고 bFullMutex가 비활성화됩니다. 실제로 데이터베이스 연결 및 준비된 문(prepared 문)에 대한 잠금을 비활성화하므로 동일한 데이터베이스 연결 또는 준비된 문을 여러 스레드에서 동시에 사용할 수 없습니다. SQLite가 컴파일될 때 SQLITE_THREADSAFE=2 매개변수가 추가되면 기본적으로 활성화됩니다. SQLITE_THREADSAFE가 0이 아닌 경우 SQLite를 초기화하기 전에 sqlite3_config(SQLITE_CONFIG_MULTITHREAD)를 호출하여 활성화하거나 데이터베이스 생성 연결 시 SQLITE_OPEN_NOMUTEX 플래그를 설정할 수 있습니다.

직렬: SQLite는 스레드로부터 안전합니다. bCoreMutex 및 bFullMutex를 포함한 모든 잠금을 활성화합니다. 데이터베이스 연결과 준비된 문이 모두 잠겨 있기 때문에 멀티 스레드는 이러한 객체를 동시에 사용할 수 없으며 직렬이 됩니다. SQLite가 컴파일될 때 SQLITE_THREADSAFE =1 매개변수가 추가되면 기본적으로 활성화됩니다. SQLITE_THREADSAFE가 0이 아닌 경우 SQLite를 초기화하기 전에 sqlite3_config(SQLITE_CONFIG_SERIALIZED)를 호출하여 활성화하거나 데이터베이스 연결을 생성할 때 SQLITE_OPEN_FULLMUTEX 플래그를 설정할 수 있습니다.

여기서 언급한 초기화는 sqlite3_initialize() 함수를 호출하는 것을 의미합니다. 이 함수는 sqlite3_open() 호출 시 자동으로 호출되며 첫 번째 호출만 유효합니다.

스레드 안전성을 달성하려면 SQLite는 컴파일할 때 SQLITE_THREADSAFE 전처리 매크로를 1로 설정해야 합니다. Windows 및 Linux에서는 이것이 잘 컴파일된 바이너리 배포판의 설정입니다. 사용 중인 라이브러리가 스레드로부터 안전한지 확실하지 않은 경우 sqlite3_threadsafe() 인터페이스 를 호출하여 확인할 수 있습니다. 컴파일 타임 SQLITE_THREADSAFE 매개변수를 얻으려면 sqlite3_threadsafe()를 호출하세요.

즉, 스레드 모드는 컴파일 타임(sqlite 라이브러리가 소스 코드에서 컴파일될 때), 시작 시(sqlite를 사용하는 애플리케이션이 초기화될 때) 또는 런타임 시(데이터베이스가 실행될 때) 지정할 수 있습니다. 연결이 생성됩니다). 일반적으로 런타임에 지정된 모드는 시작 시 지정된 모드를 재정의하고, 시작 시 지정된 모드는 컴파일 시 지정된 모드를 재정의합니다. 그러나 단일 스레드 모드가 지정되면 재정의할 수 없습니다. 기본 스레드 모드는 직렬 모드입니다.

컴파일 시 스레드 모드 선택
SQLITE_THREADSAFE 매크로를 정의하여 스레드 모드를 지정할 수 있습니다. 지정하지 않으면 기본값은 직렬 모드입니다. 직렬 모드 사용을 지정하려면 SQLITE_THREADSAFE=1 매크로를 정의하고, 단일 스레드 모드를 사용하려면 0을, 다중 스레드 모드를 사용하려면 2를 정의합니다.

sqlite3_threadsafe()함수의 반환 값은 컴파일 타임에 지정된 스레드 모드를 결정할 수 있습니다. 단일 스레드 모드가 지정된 경우 함수는 false를 반환합니다. 직렬 또는 다중 스레드 모드가 지정된 경우 함수는 true를 반환합니다. sqlite3_threadsafe() 함수는 시작 및 런타임 시 멀티 스레드 모드와 모드 선택보다 우선하므로 멀티 스레드 모드와 직렬 모드 또는 시작 모드와 런타임 모드를 구분할 수 없습니다.

마지막 문장은 sqlite3_threadsafe 함수 SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE } 단일 스레드 모드가 지정된 경우; 컴파일 타임에는 중요 뮤텍스 논리가 생성 시 생략되므로 시작 또는 런타임 시 직렬 모드 또는 다중 스레드 모드를 지정할 수 없습니다.

시작 시 스레드 모드 선택
컴파일 시 단일 스레드 모드가 지정되지 않은 경우 sqlite3_config() 함수를 사용하여 애플리케이션 초기화 중에 스레드 모드를 수정할 수 있습니다. 매개 변수 SQLITE_CONFIG_SINGLETHREAD는
단일 스레드 모드로, SQLITE_CONFIG_MULTITHREAD는 다중 스레드 모드로, SQLITE_CONFIG_SERIALIZED는 직렬 모드로 지정할 수 있습니다.

런타임 시 스레드 모드 선택
컴파일 시 또는 시작 시 단일 스레드 모드를 지정하지 않으면 각 데이터베이스 연결을 생성할 때 멀티 스레드 모드 또는 직렬 모드로 개별적으로 지정할 수 있지만 지정할 수는 없습니다. 스레드 모드. 컴파일 시 또는 시작 시 단일 스레드 모드가 지정된 경우 연결을 생성할 때 다중 스레드 또는 직렬 모드를 지정할 수 없습니다.

연결 생성 시 스레드 모드를 지정하려면 sqlite3_open_v2() 함수의 세 번째 매개변수를 사용하세요. SQLITE_OPEN_NOMUTEX는 다중 스레드 모드에서 생성된 연결을 식별합니다. SQLITE_OPEN_FULLMUTEX는 직렬 모드에서 생성된 연결을 식별합니다. 식별자가 지정되지 않거나 sqlite3_open() 또는 sqlite3_open16() 함수를 사용하여 데이터베이스 연결을 생성하는 경우 컴파일 시간이나 시작 시간에 지정된 스레드 모드가 기본 스레드 모드로 사용됩니다.

[관련 추천]

1. XML 무료 동영상 튜토리얼

Li Yanhui XHTML 동영상 튜토리얼

3. XML 기술 매뉴얼

위 내용은 SQLite 멀티스레딩 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.