class CDBConnPool {
public:
int cnt;
int m_MaxCount;
int m_CurCount;
int m_LimitCount;
char m_Ip[128];
char m_DBName[128];
char m_User[128];
char m_Passwd[128];
HANDLE m_Mutex[POOL_MAX_SIZE];
CDBConn *m_Condb[POOL_MAX_SIZE];
public:
CDBConnPool();
~CDBConnPool();
void Create(int max_count, char *ip, char *db_name, char *user, char *passwd);
void CreateConnPool();
void Release();
CDBConn *GetConnection();
int ReturnConnection(CDBConn *conn);
};
주의 해야 할점은 Get/Release 상황에서 Locking / Unlocking에 대한 이해 부분이다.
구현에서는 다중 뮤텍스락에 대해 WaitForMultipleObjects을 사용하였다.
Get/Release 코드는 아래와 같다.
DWORD ret = WaitForMultipleObjects(m_MaxCount,m_Mutex,false, INFINITE);
if((ret-WAIT_OBJECT_0) >= m_MaxCount || (ret-WAIT_OBJECT_0) < 0)
return NULL;
m_CurCount--;
return m_Condb[ret-WAIT_OBJECT_0];
Wait 상황에서 리턴되는 값의 Valid함을 보장하고 그 값에서 해당 뮤텍스를 리턴 하도록 한다.
if (conn == NULL) return -1;
for(int n = 0;n < m_MaxCount;n++){
if(m_Condb[n] == conn){
conn->CloseQuery();
cnt++;
m_CurCount++;
ReleaseMutex(m_Mutex[n]);
}
}
return 0;
}
Release를 하는 경우 해당 뮤텍스를 릴리즈 하여 대기중인 쓰레드에게 해당 뮤텍스에 대한 권한을 승계 하도록 만든다.
발생 하게 되므로 주의 하도록 한다.