Sau rất nhiều thử nghiệm, cuối cùng tôi nhận thấy rằng vấn đề không phải ở Entity framework hay NpgSql, mà sự chậm trễ mà tôi thấy là do ghi vào bộ nhớ đệm. Tôi luôn ghi tệp 30MB trước khi chèn một hàng vào bảng 1 và tôi tin rằng việc ghi tệp được thực hiện sau khi File.WriteAllBytes trả về nên nó sẽ không ảnh hưởng đến bất kỳ câu lệnh thời gian nào trong tương lai. Tuy nhiên, ở lớp hệ điều hành, việc ghi vào đĩa không thực sự được thực hiện vào thời điểm chạy câu lệnh chèn khiến câu lệnh chèn bị trì hoãn một cách giả tạo.
Tôi đã chứng minh điều này bằng đoạn mã sau:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
đồng hồ bấm giờ 1 cho thấy rằng File.WriteAllBytes luôn mất khoảng 500 mili giây, sau đó đồng hồ bấm giờ 2 hẹn giờ khoảng 20 đến 30 giây.
Nếu tôi thay đổi MethodThatInsertsIntoTable1 để chèn vào một bảng khác thì vẫn mất 20 đến 30 giây bất kể bảng nào.
Nếu tôi tăng Thread.Sleep (1000) thành Thread.Sleep (30000) thì đồng hồ bấm giờ 2 ghi lại rằng quá trình chèn mất ít hơn 10 mili giây.
Điều này cho thấy rằng ngay cả sau khi File.WriteAllBytes trả lại quyền kiểm soát cho chương trình, thì việc ghi tệp vào đĩa vẫn chưa thực sự hoàn thành.
Môi trường tôi đang chạy là linux trên pi raspberry. Một bài kiểm tra tốc độ ghi xác nhận rằng tốc độ ghi của tôi vào thẻ sd chỉ hơn 1MB / s sẽ phù hợp với kết quả tôi đang thấy, 20-30 giây để ghi một tệp 30MB, không thể thực hiện được trong 500ms. đồng hồ bấm giờ 1 cho biết chính xác là như vậy.
Một người dùng khác dường như gặp sự cố do điều này trong File.WriteAllBytes thì không không chặn
Sau khi thêm ổ cứng SSD USB bên ngoài vào mâm xôi pi và thay đổi để lưu tệp ở đó, việc lưu tệp chỉ mất 0,5 giây và sự cố sẽ biến mất.