개발자의 길 52

[SQLite3][C++] SQLite3 에서 record 를 지워도 DB 용량이 줄어들지 않는 이유는? - page, vacuum, rbu vacuum.

SQLite3 에서 아래와 같이 DELETE query 를 실행하면 record 를 지울 수 있다 DELETE FROM [table_name] WHERE [column_value]=? WHERE 문을 제거하면 전체 테이블이 모두 지워지는데, DELETE Query 를 이용해서 record 는 모두 삭제가 되어도 DB 용량은 그대로인 것을 볼 수가 있을 것이다. 이는 SQLite3 가 reocrd 를 삭제해도 디스크로부터 할당받은 데이터 공간을 바로 버려버리는 것이 아니라, 이후에 새로운 record 가 Insert 되었을 때 재활용하기 위해 page 단위로 빈 공간이라는 정보를 유지하고 있기 때문이다. Vacuum 그러면 DB Size 를 줄이기 위해서는 어떻게 해야 하는가? 간단하게도 VACUUM 이라..

[SQLite3][C++] Sqlite3 의 journal file 에 대해

SQLite 의 Journal file SQLite 에서는 갑작스러운 power failure 등으로 인한 쓰기 작업이 중단되었을 경우 DB 손상을 막기 위해 Rollback Journal 이라는 기법을 사용한다. DB 에 write 작업이 발생하게 되면, rollback journal 이라는 곳에 데이터가 write 로 인해 변경되기 전으로 돌아갈 수 있도록 하는 정보들을 기록하게 된다. 데이터 write 및 commit 이 종료되면 journal file 을 삭제하게 되며, 쓰기작업 도중에 종료될 경우 삭제하지 않은 journal file 이 남아있는 상태로 남아있게 된다. rollback journal 을 이용해 무결성 복원을 해야하는 경우 이 journal 을 hot journal 이라고 부르는데..

[SQLite3][C++] SQLite 의 file lock 매커니즘

ACID 와 SQLite3 SQLite3 는 Database 의 ACID 를 준수하기 위한 하나의 방법으로 File Locking Mechanism 을 사용한다. 잠시 ACID 에 복습해 보자면 아래와 같다. Atomicity 원자성 : 하나의 논리적 실행단위인 트랜잭션이 도중이 중단되지 않고 끝까지 실행되어야 함 Consistency 일관성 : 트랜잭션 실행이 종료된다면 언제나 일관성 있는 상태의 Database 가 되어야 한다. Isolation 독립성 : 트랜잭션 수행 중에는 다른 어떠한 트랜잭션이 도중에 끼어들거나 트랜잭션의 중간 작업내용을 볼 수 없음을 의미한다. Durability 지속성 : 한번 트랜잭션이 수행 되었다면 그 결과는 시스템 장애나 전원 종료 등이 발생하더라도 영구히 남아야 함을..

[SQLite3][C++] sqlite3_busy_timeout

지난 포스팅에 이어, SQLite3 database 가 locked 상태인 경우에 일정 시간 대기를 하도록 설정이 가능한 sqlite3_busy_timeout 함수를 살펴보고자 한다. 해당 함수에 대한 문서는 아래 주소를 참고 바란다. https://www.sqlite.org/c3ref/busy_timeout.html sqlite3_step 을 통해 DB 에 접근을 하는 동작을 수행할 때 만약에 DB 가 Write 접근 - Read lock 이나 Read/Write 접근 - Write lock 인 상태에는 SQLITE_BUSY 를 즉시 리턴하게 된다. 여러 쓰레드/프로세스에서 해당 데이터베이스에 접근하는게 일반적인 상황이라면 즉시 접근실패를 하고 종료하는 것 보다 lock 을 놓을 때 까지 대기하는것이 ..

[SQLite3][C++] database is locked 에러가 나올 때 ?

database is locked 에러가 나올 때 SQLite 개발을 하다 보면 저런 에러메시지를 만나거나 에러코드 SQLITE_BUSY (5) 를 반환받아서 DB 에 대한 읽기/쓰기 가 불가능한 경우를 본 적이 있을 것이다. 해당 에러코드가 리턴되는 경우는 DB 에 Write 작업을 하는 도중, Read/Write 를 하고자 접근을 한 경우이다. SQLite 는 기본적으로 Atomicity (원자성) 을 지키기 위해서 DB 에 write 작업이 발생을 할 경우 File 단위로 lock 을 걸어 버려서, 같은 Database 의 다른 table 에 접근한다 하더라도 lock 이 걸린 상태에서는 읽기/쓰기가 불가능하다. 혹시나 SQLite3 Lib 을 이용한 프로그램에서 저런 문제가 나온다면, 읽기/쓰기가..

[Design pattern] 추상 팩토리 패턴 ( Abstract Factory pattern )

팩토리 메서드 패턴과 유사해서 구분이 애매한 패턴인 추상 팩토리 패턴에 대해 소개하고자 한다. ( 팩토리 메서드 패턴 : makedotworld.tistory.com/44 ) 팩토리 메서드 패턴과 공통점으로는, 객체 생성을 하고자 할때 객체에 대한 구상 형식을 알 필요가 없이, 추상 형식만 알면 된다는 점이다. 예를 들면, 팩토리 메서드 패턴에서 PIzza 가 추상 형식이고, PotatoPizza 가 구상 형식이 된다. 하지만 방법에서의 차이점이 있다. 팩토리 메서드 패턴은 Client 가 Creator 를 상속하여 팩토리 메서드를 Override 함으로써 Client 가 원하는 객체를 만든다. 추상 팩토리 패턴은 interface 로 선언되어 있는 Creator 를 Implement 하여, 추상 형식의..

개발자의 길 2020.09.15

[Design pattern] 팩토리 메서드 패턴 ( Factory method pattern )

코딩을 하다 보면, 내가 만들지 않은 다른 클래스를 사용 할 때 맨 처음 하는 것은 객체 생성이다. 객체 생성을 하고, 해당 객체를 온전하게 사용하기 위해서는 해당 클래스에대한 설명을 듣고, 함수 사용 방법을 익힌 뒤 생성된 객체를 통해 함수를 호출할 것이다. 피자를 만든다고 예를 들면, 아래와 같이 말이다. Pizza *myPizza.= new PotatoPizza(); myPizza.prepare(); myPizza.bake(); myPizza.cut(); myPizza.box(); 여기까지는 좋다. 하지만 실수는 언제나 있기 마련이다. 1) Pizza 클래스를 사용하는 클라이언트가 prepare() 함수를 호출하는 것을 뺴먹었다면? 어떤 피자는 자르면 안 되는데 cut() 함수를 호출해 버렸다면? ..

개발자의 길 2020.08.30

[Effective C++] Chapter 5 구현

항목 26: 변수 정의는 늦출 수 있는 데까지 늦추는 근성을 발휘하자 쓸데없는 생성자와 소멸자 호출을 막기 위해, 변수 정의는 최대한 늦추도록 하자. 또한, for 문 안에서 변수를 정의해야할 경우, 생성자/소멸자 호출과 대입연산 중 어느것이 더 자원을 많이 먹을지 고려한 다음 사용하자 항목 27: 캐스팅은 절약, 또 절약! 잊지 말자 구형 스타일의 캐스트가 아닌 C++ 스타일의 캐스트를 선호하자, 발견하기도 쉽고 의도파악에 도움이 된다. 가능한 캐스팅을 피하되, 어쩔수 없이 써야 된다면 함수 안에 숨길 수 있도록 하자. 그러면 최소한 사용자는 자신의 코드에는 캐스팅을 넣지 않을 수 있다. 항목 28: 내부에서 사용하는 객체에 대한 핸들을 반환하는 코드는 되도록 피하자 캡슐화 정도를 높이고, 상수멤버 함..

[Effective C++] Chapter 4 설계 및 선언

항목 18: 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 인터페이스는 일관성 있는 네이밍, 새로운 타입을 제공하여 함수 인자로 받도록 하여 잘못된 동작 사용 못하도록 하기, 자원 관리 책임을 사용자에게 주지 않기 등이 있다. shared_ptr 을 사용하면 자원에 대한 권한은 라이브러리에 있게 된다. 항목 19: 클래스 설계는 타입 설계와 똑같이 취급하자 클래스를 설계할 때는 기본 타입을 정의하는 것만큼 고민을 하자. 책에 정리되어 있는 모든 고려사항을 참고하여 클래스를 짜 보도록 하자. 항목 20: '값에 의한 전달'보다는 '상수객체 참조자에 의한 전달'방식을 택하는 편이 대개 낫다 함수를 호출할때 기본타입을 제외하고는 복사 생성자가 호출될 가능성을 없애기 위해, 상수객체 참조자..

반응형