Tôi có một câu hỏi đơn giản mà trả 25.026 hàng:MySqlDataReader dừng đọc sau khoảng 4 phút và trả
MySqlCommand cmd = new MySqlCommand("SELECT ID FROM People", DB);
MySqlDataReader reader = cmd.ExecuteReader();
(ID
là một int
.) Nếu tôi chỉ làm điều này:
int i = 0;
while (reader.Read()) i++;
i
sẽ bằng 25026. Tuy nhiên, tôi cần thực hiện một số quy trình trên mỗi ID trong vòng lặp của mình; mỗi lần lặp lại kết thúc ở một nơi nào đó trong hàng trăm mili giây.
int i = 0;
MySqlCommand updater = new MySqlCommand("INSERT INTO OtherTable (...)", anotherConnection);
updater.Prepare();
while (reader.Read()) {
int id = reader.getInt32(0);
// do stuff, then
updater.ExecuteNonQuery();
i++;
}
Tuy nhiên, sau khoảng 4:15 xử lý, reader.Read()
đơn giản trả về sai. Trong hầu hết các thử nghiệm của tôi chạy, i
bằng 14896, nhưng đôi khi nó dừng lại ở 11920. Việc bỏ số DataReader
sau khi cùng một số lượng hồ sơ là đáng ngờ và thời gian dừng lại sau một số hàng khác nhau có vẻ xa lạ hơn.
Tại sao reader.Read()
trả về false khi chắc chắn có nhiều hàng hơn? Không có ngoại lệ nào bị ném – thậm chí không phải ngoại lệ cơ hội đầu tiên.
Cập nhật: tôi đã đề cập trong câu trả lời của tôi để Shaun's answer rằng tôi đã trở thành tin rằng MySqlDataReader.Read()
được nuốt một ngoại lệ, vì vậy tôi đã tải về Connector/Net's source code (bzr branch lp:connectornet/6.2 C:/local/path
) và bổ sung dự án để giải pháp của tôi. Chắc chắn, sau 6:15 xử lý, là một ngoại lệ!
Cuộc gọi tới resultSet.NextRow()
ném một số MySqlException
với thông báo "Đọc từ luồng không thành công". Các InnerException
là một SocketException
:
{ Message: "An existing connection was forcibly closed by the remote host",
ErrorCode: 10054,
SocketErrorCode: ConnectionReset }
10054 có nghĩa là socket TCP đã bị hủy bỏ với một RST
thay vì bắt tay bình thường ngắt kết nối (FIN
, FIN ACK
, ACK
), mà nói với tôi điều gì đó screwy đang xảy ra với kết nối mạng.
Trong my.ini, tôi đã quay số interactive_timeout
và wait_timeout
đến 1814400 (giây) không có kết quả.
Vậy ... tại sao kết nối của tôi bị hỏng sau khi đọc trong 6:15 (375 giây)?
(Ngoài ra, tại sao lại là ngoại lệ này bị nuốt khi tôi sử dụng hệ nhị phân chính thức? Nó trông như nó nên bong bóng lên đến mã ứng dụng của tôi.)
Câu lệnh chèn 14895th trông như thế nào? Ngoài ra, chỉ là một quan sát, nhưng 4:15 là 255s. Có một truy cập một nơi nào đó liên quan đến một trong hai người đọc hoặc chèn trải qua một tràn im lặng? – Tahbaza
@Tahbaza: Chèn không khác gì phần còn lại. Dù sao, vì nó thực hiện trên một 'MySqlConnection' thứ hai, nó sẽ không ảnh hưởng đến cái đầu tiên mà' DataReader' đang bật. Theo thời gian, nó là 4:15 ± 15s; Tôi đã không thực hiện bất kỳ thời gian chính xác nào. Tôi không có bất kỳ quầy nào khác ngoài 'i', vì vậy tôi không nghĩ đó là một sự tràn ngập. – josh3736
Bạn đã kiểm tra xem đó có phải là thời gian chờ thực thi tập lệnh không? – robert