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

Update SQLite database without restarting application

我有一个 NodeJS 应用程序 运行 在生产服务器上 forever.

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

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

// 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...

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

您不得覆盖可能有一些开放连接的数据库文件(请参阅 How To Corrupt An SQLite Database File)。

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

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

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