SQLite 를 사용하는 응용프로그램인데.. 여러 쓰레드들이 DB접근을 할수 있는 상황 이더라구.. 그리고 DB 객체 인스턴스는 싱글톤 방법으로 사용하게 해놨어.
"DB 접근을 원자적으로 어떻게 할까?" 가를 어떻게 해야 깔끔하게 할지... 고민을 해봤지.
보통 DB 접근을 이런식으로 하게 해놨어~
DB::GetInstance()->Insert(...);
위에 문장에서 특별히 동기화 부분을 신경 쓰지 않고 어떤식으로 해야 맞을까..?
// DB Proxy class
class DBProxy
{
public:
explicit DBProxy( DB* p ) : p_( p ) { EnterCriticalSection( &db_access_cs_ ); }
~DBProxy() { LeaveCriticalSection( &db_access_cs_ ); }
inline DB* operator->() const { return p_; }
private:
DB* p_;
};
// 실제 DB 쿼리를 실행하는 클래스
class DB
{
public:
static DBProxy GetInstance() { return DBProxy( p_ ); }
...
private:
static DB* p_;
};
위와 같이 했더니 DB::GetInstance()->Insert(...); 요문장 에서 GetInstance() 를 호출 하는 시점에 다른놈이 DB 클래스를 사용하고 있으면 대기 하는 구조가 되더라구
어때? 괜츈???
아 MEC++ 에서도 나온 객체값을 읽기와 쓰기를 구별하기 위해서도 Proxy 패턴을 쓴다고 알고 있고, 실무에서 써봣는데 괜찮터라구