Astăzi, serverul a suferit un atac CC, ceea ce a făcut ca site-ul de pe IIS să se blocheze, iar site-ul a fost blocat din nou după repornire, verificați jurnalul de erori al site-ului după cum urmează:
System.Data.Entity.Core.EntityCommandExecutionException: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 执行超时已过期。完成操作之前已超时或服务器未响应。 ---> System.ComponentModel.Win32Exception: 等待的操作过时。
Un număr mare de excepții pentru timeout-ul interogării fac ca site-ul să se blocheze, iar instrucțiunile SQL pentru timeout-ul interogării provin toate dintr-o metodă de preluare aleatorie a datelor, codul fiind următorul:
Codul înseamnă aproximativ: 10 date sunt selectate aleatoriu din baza de date, atâta timp cât nu se duplică ID-ul curent.
Ceea ce pare o cerință simplă a făcut ca serverul să se închidă! Instrucțiunea SQL generată de codul de mai sus este următoarea:
Planul de implementare este următorul:
Dacă baza de date are 1 milion de date, nu ar avea nevoie mai întâi de 999.999 de date și apoi de 10 date din aceste 999.999 de date?
Întreabă-l pe cel mai mare din grupul dba și primește răspunsul: "DaDoamne, trebuie să fie lent, și trebuie să numești asta statement sql de multe ori.
La început am crezut că este o problemă de EF,De fapt, dacă scrii direct în sql, nu există o soluție bună。
Dacă da, vă rog să mă învățați!
|