前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rsync同步SQLite3文件API返回旧数据

rsync同步SQLite3文件API返回旧数据

作者头像
雪飞鸿
发布2022-10-28 10:15:45
5660
发布2022-10-28 10:15:45
举报
文章被收录于专栏:me的随笔

问题描述

EFCore cannot get new value in docker, if use rsync replace sqlite file

基于.NET6开发一个查询SQLite的API,使用Docker进行部署,通过挂载的方式来访问数据库文件:docker run -d --name ddocker -p 9100:80 -v /mnt/c/Users/chiwenjun/Desktop/pdemo/docs/:/home/db/ddocker 使用rsync命令从其他目录同步文件到/mnt/c/Users/chiwenjun/Desktop/pdemo/docs/目录下,API依然返回旧数据。

原因解释

查询SQLite数据库时,数据库中符合查询条件的数据会以页缓存(和连接相关)的形式存放到内存中,减少后续查询的磁盘I/O操作;

修改数据库文件会导致页缓存失效;

rsync命令会导致文件inode值发生改变,cp命令不会;

.NET串默认开启了数据库连接池,使用rsync命令同步文件不会使页缓存失效,所以应用查询依然走页缓存,也就无法感知到数据变化,连接字符串中禁用连接池,可解决该问题。

本地在IDE中直接运行代码,在Mac上测试呈现出和Linux上一样的问题,在Windows环境下,开启连接池时,SQLite文件处于被占用状态,在wsl2中使用rsync无法替换文件,报Permission denied (13)错误。

Docker文件挂载

Docker即可以挂载目录也可以直接挂载具体的文件,挂载目录在修改文件后容器中也会生效,挂载文件在修改后若inode发生变化则容器内不会生效。

若要挂载的文件内容发生变化后同步到容器,需设置文件权限为777,不建议这么做。

参考

Can cached database connections be aware of file changes?

SqliteCacheMode Enum

SQLite Page cache

What exactly is being cached when opening/querying a SQLite database

解决docker通过volumes挂载文件不生效,修改后容器内数据不同步,需要重启容器才能同步的问题

docker 挂载文件不同步问题记录

解密 Docker 挂载文件,宿主机修改后容器里文件没有修改

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题描述
  • 原因解释
  • Docker文件挂载
  • 参考
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档