Udo*_*o G 5 sqlite client-server
我完全新的SQLite和我打算在服务器上生成一个数据库,发送到客户端的文件和客户端进行数据查找上使用的M2M /客户端 - 服务器环境中使用它.
问题是:我可以在客户端同时使用它时替换整个数据库文件吗?
问题可能听起来很愚蠢,但客户端是Linux瘦客户端,要替换数据库文件,临时文件将重命名为最终文件名.在Linux中,仍然打开旧版本文件的程序仍将访问旧数据,因为操作系统保留旧文件,直到所有文件句柄都已关闭.只有新的open()s才能访问该文件的新版本.
简而言之:
我知道这是一个非常具体的问题,但也许有人可以告诉我这是否是SQLite的问题,或者在客户端运行时是否有类似的方法来替换数据库.我不希望从服务器发送一串SQL语句向客户端更新数据库.
不,您不能只替换打开的 SQLite3 DB 文件。SQLite 将继续使用相同的文件描述符(或 Windows 中的句柄),除非您关闭并重新打开数据库。进一步来说:
删除和替换打开的文件要么无用(Linux),要么不可能(Windows)。SQLite 永远不会看到新文件的内容。
覆盖 SQLite3 DB 文件会导致数据损坏。来自SQLite3 文档:
同样,如果恶意进程打开数据库文件或日志并将格式错误的数据写入其中,则数据库将被损坏。
任意覆盖数据库文件的内容可能会导致一大堆问题:
处理这个问题的最佳方法是适当的客户端-服务器实现,其中客户端数据库文件根据来自服务器的数据进行更新。从长远来看,这将带来更大的灵活性,同时还可以通过发送更新而不是整个文件来降低带宽要求。
如果不可能,您应该分三个独立步骤更新客户端数据库文件:
如果您出于某种原因不想关闭数据库文件,那么您应该让您的应用程序(甚至是单独的进程)使用新文件作为输入来更新原始数据库文件。在这种情况下,您可能会对SQLite3备份 API感兴趣。