记.Net Core Host服务使用Dapper内存溢出问题
背景
项目要做一个数据迁移,牵扯大概60多张表,几千万数据,这些数据都被放到了csv文件中并拆分成了10w条记录一个文件。
思路是使用.Net Core Host开一个线程去读取文件夹csv根据业务导入到表就可以。
ps:第一次用Dapper做这种处理
问题
在导入过程中,因为我们的服务器内存只有8G。经常跑一会服务器就内存溢出了。
因为我们开始的设计就是一个csv导入完成,释放,第二个csv加载,应该不会有内存溢出问题。
我们一开始怀疑是不是csv数据读取到内存没有释放,也怀疑过Cli的虚拟内存占用问题。
调查
没办法,直接上工具查内存。一查结果是SQLMapper有个缓存。
原因
Dapper 使用一个内部缓存来存储 SQL 查询和相应的命令类型,以提高性能。但是,如果查询非常频繁且各不相同,这个缓存可能会占用大量内存。
为了防止内存溢出,需要手动调用 SqlMapper.PurgeQueryCache() 方法来清理缓存
结论
怎么说呢,第一次用Dapper不知道有这个东西,开始从来没怀疑过Dapper也是EF用的太多了,从来没注意过有缓存释放这种说法。