目錄
開個貼,專門記錄使用EF Core遇到的問題,以后自己用.net寫東西,操作數據庫就使用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的速度也差不多啊
缺點還有:
- 我手動操作數據庫的時候,單單一個查詢語句半天才有反應,不能使用這個方法3
- 如果文件很大,我所有的行都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();
}
換了正則之后和方法1差不多了,每秒400多條