代码之家  ›  专栏  ›  技术社区  ›  Alex Jenter

sqlite文件锁定和dropbox

  •  5
  • Alex Jenter  · 技术社区  · 15 年前

    我正在开发Visual C++中的一个应用程序,它使用一个SqLITE3DB来存储数据。通常它大部分时间都放在盘子里。

    我还希望能够将我的应用程序放在Dropbox文件夹中,以便在多台PC上共享。 直到Dropbox最近更新了它自己,它才真正的工作得很好。 现在它说它“无法同步正在使用的文件”。sqlite文件在我的应用程序中打开,但锁是共享的。有一些准备好的语句,但在使用后立即重置 step .

    有什么方法可以同步打开的sqlite数据库文件吗?谢谢!

    以下是我只用于测试(无错误处理)的简单包装,以防有帮助:

     class Statement
     {
     private:
      Statement(sqlite3* db, const std::wstring& sql) : db(db)
      {
       sqlite3_prepare16_v2(db, sql.c_str(), sql.length() * sizeof(wchar_t), &stmt, NULL);
      }
    
     public:
      ~Statement() { sqlite3_finalize(stmt); }
    
     public:
      void reset() { sqlite3_reset(stmt); }
      int step() { return sqlite3_step(stmt); }
      int getInt(int i) const { return sqlite3_column_int(stmt, i); }
    
      std::wstring getText(int i) const
      {
       const wchar_t* v = (const wchar_t*)sqlite3_column_text16(stmt, i);
       int sz = sqlite3_column_bytes16(stmt, i) / sizeof(wchar_t);
       return std::wstring(v, v + sz);
      }
    
     private:
      friend class Database;
    
      sqlite3* db;
      sqlite3_stmt* stmt;
     };
    
    
     class Database
     {
     public:
      Database(const std::wstring& filename = L"")) : db(NULL)
      {
       sqlite3_open16(filename.c_str(), &db);
      }
    
      ~Database() { sqlite3_close(db); } 
    
      void exec(const std::wstring& sql)
      {
       auto_ptr<Statement> st(prepare(sql));
       st->step();   
      }
    
      auto_ptr<Statement> prepare(const std::wstring& sql) const
      {
       return auto_ptr<Statement>(new Statement(db, sql));
      }
    
     private:
      sqlite3* db;
     };
    

    UPD: 尝试注释掉sqlite3.c中对lockfile和lockfileex的所有调用-结果相同。

    UPD2: 尝试在空闲时调用sqlite3_close(作为概念证明)-结果仍然相同!filemon告诉我们文件仍然没有关闭,只是没有锁定。

    UPD3: 自动提交模式打开。开始和提交匹配的数目(类事务和raii负责)。sqlitemanager能够在我的应用程序运行时连接到数据库并对其进行修改。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Doug Currie    15 年前

    正在检查sqlite3_close()的结果。也许是因为你还没有完成所有准备好的发言稿,所以没有起作用。

        2
  •  2
  •   coderintherye    15 年前

    你在用什么文件系统?

    您确定“自动提交”已打开和/或正在提交报表吗?我记得有一个问题,不承诺和锁会留在。

        3
  •  2
  •   Doug Currie    15 年前

    alex pechnikov有一个多主sqlite数据库复制程序 sqlite3-rdiff . 对于您试图完成的任务来说,这可能是过分的,但它可能比文件复制更容易。

    sqlite还有一个 Online Backup API ;该页上有一个示例:示例2:正在运行的数据库的联机备份。