同時にsqliteデータベースを訪問してdatabse is lockedの誤りの一つの解決方法が現れます.

2807 ワード

作者:金色燦
ソース:http://blog.csdn.net/clever101
   
        同時訪問でsqliteデータベースはこのようなエラーが発生します.databseis locked、これはsqliteデータベースが合併に対してあまりサポートしないためです.ネット上での考え方の一つは、信号量を相互に反発することによって、同時訪問の目的を達成することです.以下はプラットフォームをまたぐ相互反発信号量の種類である.
//ProcessMutex.h  : 
#ifndef __PROCESS_MUTEX_H__
#define __PROCESS_MUTEX_H__
 
#if defined _WIN32 || defined _WIN64

     #include <Windows.h>

#endif
 
#ifdef linux
#include <unistd.h>
#include <semaphore.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <memory.h>
#endif
 
class CProcessMutex
{
public:
    /*           */
    CProcessMutex(const char* name = NULL);
    ~CProcessMutex();
 
    bool Lock();
    bool UnLock();
private:

#if defined _WIN32 || defined _WIN64

    void* m_pMutex;

#endif

#ifdef linux
    set_t* m_pSem;
#ednif
    char m_cMutexName[30];
};
#endif

 //ProcessMutex.cpp  :
#include "ProcessMutex.h"
 
#if defined _WIN32 || defined _WIN64
 
CProcessMutex::CProcessMutex(const char* name)
{
    memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
    int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
    strncpy(m_cMutexName, name, min);
    m_pMutex = CreateMutex(NULL, false, m_cMutexName);
}
 
CProcessMutex::~CProcessMutex()
{
    CloseHandle(m_pMutex);
}
 
bool CProcessMutex::Lock()
{
    //       
    if (NULL == m_pMutex)
    {
        return false;
    }
     
    DWORD nRet = WaitForSingleObject(m_pMutex, INFINITE);
    if (nRet != WAIT_OBJECT_0)
    {
        return false;
    }
 
    return true;
}
 
bool CProcessMutex::UnLock()
{
    return ReleaseMutex(m_pMutex);
}
 
#endif
 
#ifdef linux
 
CProcessMutex::CProcessMutex(const char* name)
{
    memset(m_cMutexName, 0 ,sizeof(m_cMutexName));
    int min = strlen(name)>(sizeof(m_cMutexName)-1)?(sizeof(m_cMutexName)-1):strlen(name);
    strncpy(m_cMutexName, name, min);
    m_pSem = sem_open(name, O_CREAT, 0644, 1);
}
 
CProcessMutex::~CProcessMutex()
{
    int ret = sem_close(m_pSem);
    if (0 != ret)
    {
        printf("sem_close error %d
", ret); } sem_unlink(m_cMutexName); } bool CProcessMutex::Lock() { int ret = sem_wait(m_pSem); if (ret != 0) { return false; } return true; } bool CProcessMutex::UnLock() { int ret = sem_post(m_pSem); if (ret != 0) { return false; } return true; } #endif
使用例コードは以下の通りです.
CProcessMutex pMutex("MutexName");

pMutex.Lock();

sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg); //   sqlite     

pMutex.UnLock();
参考文献:
 
1.マルチプロセス間の相互反発信号量の実現(Linuxとwindowsはプラットフォームにまたがる)
 
2.sqlite database is locked問題に遭遇した完璧な解決