代码之家  ›  专栏  ›  技术社区  ›  TGrif

在不重新启动应用程序的情况下更新SQLite数据库

  •  2
  • TGrif  · 技术社区  · 6 年前

    我有一个 节点JS 在生产服务器上运行的应用程序 永远 .

    该应用程序使用第三方 数据库 每天早上使用cron触发的脚本更新的数据库,cron从外部FTP将db下载到服务器。

    我花了一些时间才意识到,每次文件被重新分区时,我都需要重新启动服务器,否则我的应用程序使用的数据不会发生变化(我猜它在启动时会缓存在内存中)。

    // sync_db.sh
    wget -l 0 ftp://$REMOTE_DB_PATH --ftp-user=$USER --ftp-password=$PASSWORD \
      --directory-prefix=$DIRECTORY -nH
    forever restart 0 // <- Here I hope something nicer...
    

    如何在不重新启动应用程序的情况下刷新数据库?

    1 回复  |  直到 6 年前
        1
  •  1
  •   CL.    6 年前

    您不能覆盖可能具有某些打开连接的数据库文件(请参阅 How To Corrupt An SQLite Database File ).

    覆盖数据库的正确方法是下载到一个临时文件,然后使用备份API将其复制到实际的数据库中,这将考虑到正确的事务行为。最简单的方法是使用 sqlite3 命令行shell:

    sqlite3 $DIRECTORY/real.db ".restore $DOWNLOADDIRECTORY/temp.db"
    

    (如果您的应用程序手动缓存数据,您仍然需要告诉它重新加载数据。)