问题是:我可以在客户端同时使用它时替换整个数据库文件吗?
问题可能听起来很愚蠢,但客户端是Linux瘦客户端,要替换数据库文件,临时文件将重命名为最终文件名.在linux中,仍然打开旧版本文件的程序仍将访问旧数据,因为 *** 作系统保留旧文件,直到所有文件句柄都已关闭.只有新的open()s才能访问该文件的新版本.
简而言之:
>客户端随机访问sqlite数据库
>从服务器接收新版本的数据库并将其写入临时文件
>临时文件重命名为sqlite数据库文件
我知道这是一个非常具体的问题,但也许有人可以告诉我这是否是sqlite的问题,或者在客户端运行时是否有类似的方法来替换数据库.我不想从服务器向客户端发送一堆SQL语句来更新数据库.
解决方法 不,你不能只是替换一个开放的sqlite3数据库文件.除非您关闭并重新打开数据库,否则sqlite将继续使用相同的文件描述符(或windows中的句柄).进一步来说:>删除和替换打开的文件是无用的(linux)或不可能的(windows). sqlite永远不会看到新文件的内容.
>覆盖sqlite3数据库文件是数据损坏的一种方法.从SQLite3 documentation:
likewise,if a rogue process opens a
database file or journal and writes
malformed data into the mIDdle of it,
then the database will become corrupt.
任意覆盖DB文件的内容可能会导致一大堆问题:
>如果你很幸运,它只会导致数据库错误,无论如何都会迫使你重新打开数据库.
>根据您使用数据的方式,您的应用程序可能会崩溃和刻录.
>您的应用程序可能会尝试在新文件上应用现有日记帐.听起来很痛苦?它是!
>如果你真的不走运,用户只会从任何查询中找回无效结果.
处理此问题的最佳方法是使用适当的客户端 – 服务器实现,其中客户端数据库文件是从来自服务器的数据更新的.从长远来看,这将允许更大的灵活性,同时还通过发送更新而不是整个文件来减少带宽需求.
如果无法做到这一点,您应该通过三个不连续的步骤更新客户端数据库文件:
>向客户端应用程序发送消息以关闭数据库.这允许应用程序提交任何更改,删除任何日志文件并清除其内部状态.
>替换/覆盖文件.
>向客户端应用程序发送消息以重新打开数据库.但是,您必须再次设置所有准备好的语句.
如果您由于某种原因不想关闭数据库文件,那么您应该让您的应用程序 – 或者甚至是一个单独的进程 – 使用新文件作为输入来更新原始数据库文件.在这种情况下,你可能会对SQLite3 backup API感兴趣.
总结以上是内存溢出为你收集整理的访问时替换SQLite数据库全部内容,希望文章能够帮你解决访问时替换SQLite数据库所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)