gpt4 book ai didi

sqlite - 访问时替换 SQLite 数据库

转载 作者:IT王子 更新时间:2023-10-29 06:29:58 25 4
gpt4 key购买 nike

我完全不熟悉 SQLite,我打算在 M2M/客户端-服务器环境中使用它,在这种环境中,数据库在服务器上生成,作为文件发送到客户端并在客户端上用于数据查找。

问题是:当客户端同时使用它时,我可以替换整个数据库文件吗?

这个问题听起来可能很愚蠢,但客户端是一个 Linux 瘦客户端,要替换数据库文件,一个临时文件将重命名为最终文件名。在 Linux 中,仍然打开旧版本文件的程序仍将访问旧数据,因为操作系统会保留旧文件,直到所有文件句柄都已关闭。只有新的 open() 才能访问文件的新版本。

所以,简而言之:

  • 客户端随机访问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 文件的内容会导致一大堆问题:

    • 如果你很幸运,它只会导致数据库错误,无论如何都会迫使你重新打开数据库。
    • 根据您使用数据的方式,您的应用程序可能会崩溃并烧毁。
    • 您的应用程序可能会尝试在新文件上应用现有的日志。听起来很痛苦?是的!
    • 如果您真的不走运,用户只会从任何查询中得到无效的结果。

处理此问题的最佳方法是适当的客户端-服务器实现,其中客户端数据库文件根据来自服务器的数据进行更新。从长远来看,这将带来更大的灵 active ,同时还通过发送更新而不是整个文件来降低带宽需求。

如果那不可能,您应该分三个独立步骤更新客户端数据库文件:

  • 向客户端应用程序发送消息以关闭数据库。这允许应用程序提交任何更改、删除任何日志文件并清理其内部状态。
  • 替换/覆盖文件。
  • 向客户端应用程序发送消息以重新打开数据库。不过,您必须重新设置所有准备好的语句。

如果您出于某种原因不想关闭数据库文件,那么您应该让您的应用程序——甚至是一个单独的进程——使用新文件作为输入来更新原始数据库文件。 SQLite3 backup API在这种情况下,您可能会感兴趣。

关于sqlite - 访问时替换 SQLite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5536362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com