EFCore使⽤遇到的问题
⽬录
开个贴,专门记录使⽤EF Core遇到的问题,以后⾃⼰⽤写东西,操作数据库就使⽤EF Core了
EF Core速度问题
问题描述
我需要导⼊600多个csv⽂件,批量导⼊不会弄,⽹上也没查
使⽤了读取再存储的⽅法
EF使⽤⽅法1,每⼀⾏存储⼀次(400条/s)
可以看下⾯的代码每⼀⾏存⼀次,这种⽅法的速度差不多是每秒400多条数据的样⼦
foreach (var csvName in 600个⽂件)
{
foreach (var 每⼀⾏ in 所有⾏)
{
using (var context = new MyContext())
{
context.dGKs.Add(dGK);
context.SaveChanges();
}
}
}
EF使⽤⽅法2,链接不释放 (40条/s)
我感觉是using (var context = new MyContext())这个的问题,因为using括号内就是⼀次对数据库的链接和释放,所以我把代码改成下⾯这样了,结果⼤跌眼镜
using (var context = new MyContext())
{
foreach (var csvName in 600个⽂件)
{
foreach (var 每⼀⾏ in 所有⾏)
{
context.dGKs.Add(dGK);
context.SaveChanges();
}
}
}
上⾯这样,我以为只有⼀次的链接释放会快⼀点,没想到更慢了,⽅法1每秒400多条数据,⽅法2这样每秒只有⼏⼗条,真的慢EF使⽤⽅法3,多次add,⼀次SaveChanges(400条/s,但是数据库操作异常慢)
经过⽅法2,我⼜想了,多次add,然后⼀次SaveChanges,这样会不会快⼀点?代码⼜改成了下⾯这样
using (var context = new MyContext())
{
foreach (var csvName in 600个⽂件)
{
foreach (var 每⼀⾏ in 所有⾏)
{
context.dGKs.Add(dGK);
}
context.SaveChanges();
}
}
这样的结果也很不好,⾸先半天没反应,有反应了数据库突然出现⼏万条数据,这和⽅法1每秒400条/s的速度也差不多啊
缺点还有:
1. 我⼿动操作数据库的时候,单单⼀个查询语句半天才有反应,不能使⽤这个⽅法3
2. 如果⽂件很⼤,我所有的⾏都add到⼀起,如果是70万条数据呢,据说EF Core最⼤1000条数据,再⼤就很慢了所以,根据以上两个缺点,⽅法3也很差劲
所以,我最后还是改为了⽅法1
using内部千万不要使⽤try catch
问题描述,有⼀个字段是字符类型的,例如: "12.123","None"
我想判断这个字段是不是数字,不是数字的话直接改为"0",因为数据库⾥⾯的字段直接设定的Decimal类型
然后,我脑残的使⽤了try catch,还是在using内部使⽤的,如下
using (var context = new MyContext())
{
try{
dgk.aaa = int.Prase(dgk.aaa).toString();
}
catch{
dgk.aaa = "0";
}
context.dGKs.Add(dGK);
context.SaveChanges();
}
速度真的是超级慢了,每秒才30多条数据,慢死,catch真的耗时间
所以我换成了正则,话说,我⼀直不会正则
using (var context = new MyContext())
{
if (!Regex.IsMatch(dGK.aaa, @"^\d+\.\d+$"))
{
dGK.aaa = "0";
}
context.dGKs.Add(dGK);
context.SaveChanges();
}
try catch的使用方法换了正则之后和⽅法1差不多了,每秒400多条
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论