SQLite에서 Java를 사용하여 데이터베이스 프로그래밍을하고 있습니다.
데이터베이스에 한 번에 하나의 연결에만 쓰기 기능이 있고 한 번에 많은 연결에 읽기 기능이 있다는 것을 알았습니다.
SQLite 아키텍처가 왜 이렇게 설계 되었습니까? 작성중인 두 가지가 데이터베이스의 동일한 위치에 작성되지 않는 한, 왜 두 번의 쓰기가 불가능합니까?
SQLite에서 Java를 사용하여 데이터베이스 프로그래밍을하고 있습니다.
데이터베이스에 한 번에 하나의 연결에만 쓰기 기능이 있고 한 번에 많은 연결에 읽기 기능이 있다는 것을 알았습니다.
SQLite 아키텍처가 왜 이렇게 설계 되었습니까? 작성중인 두 가지가 데이터베이스의 동일한 위치에 작성되지 않는 한, 왜 두 번의 쓰기가 불가능합니까?
답변:
"다중 동시 쓰기"는 단일 데이터베이스 작성기보다 핵심 데이터베이스 엔진에서 수행하기가 훨씬 어렵습니다. 그것은 SQLite의 디자인 매개 변수를 넘어서며, 포함하면 SQLite의 유쾌한 작은 크기와 단순성을 파괴 할 수 있습니다.
높은 수준의 쓰기 동시성 지원은 DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL 및 Sybase와 같은 대규모 데이터베이스 엔진의 특징입니다. 그러나 기술적으로 달성하기는 어렵 기 때문에 데이터베이스, 테이블 및 행 잠금 또는보다 현대적인 구현에서는 다중 버전 동시성 제어 와 같은 광범위한 동시성 제어 및 최적화 전략이 필요 합니다 . 이 문제 / 요구 사항에 대한 연구는 방대하며 수십 년 전으로 거슬러 올라갑니다 .
SQLite는 여러 작성자를 지원하는 대부분의 서버 중심 DBMS와 디자인 철학이 다릅니다. SQL의 강력한 기능과 관계형 모델을 개별 응용 프로그램에 제공하고 실제로 각 응용 프로그램에 포함 할 수 있도록 설계되었습니다. 그 목표는 상당한 절충이 필요합니다. 여러 동시 작성기를 처리하는 데 필요한 상당한 인프라와 오버 헤드를 추가하지 않는 것도 그 중 하나입니다.
이 철학은 SQLite의 적절한 사용 페이지 에 대한 설명으로 요약 할 수 있습니다 .
SQLite는 클라이언트 / 서버 데이터베이스와 경쟁하지 않습니다. SQLite는 fopen ()과 경쟁합니다.
fopen()
하므로 일반 텍스트 파일에 동시 쓰기 작업과 함께 제공되는 모든 털이 문제를 고려하십시오.
물건을 같은 장소에 쓸 것인지 말을 할 수있는 서버가 없기 때문입니다. 파일에 쓰려고하는 프로세스는 두 가지뿐입니다.
주석에서 지적한 바와 같이, 내부 쓰레드가 동시 쓰기를 지원할 수도 있습니다. 이것이 얼마나 잘 작동하는지 확실하지 않습니다 (그에 대해 많이 생각하지 않았 음). 어쨌든 SQLite가 스레드를 사용하지 않는 이유는 다음과 같습니다. Dr Hipp는 스레드가 악하다고 생각합니다.
DR Hipp이 스레드가 악하다고 생각한다는 사실은 SQLite FAQ에 문서화되어 있습니다.