Šiandien serveris patyrė CC ataką, dėl kurios IIS svetainė užstrigo, o paleidus iš naujo svetainė vėl buvo pakabinta, patikrinkite svetainės klaidų žurnalą taip:
System.Data.Entity.Core.EntityCommandExecutionException: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 执行超时已过期。完成操作之前已超时或服务器未响应。 ---> System.ComponentModel.Win32Exception: 等待的操作过时。
Dėl daugybės užklausos skirtojo laiko išimčių svetainė užstringa, o užklausos skirtojo laiko SQL sakiniai gaunami iš atsitiktinių duomenų paėmimo metodo, kodas yra toks:
Kodas apytiksliai reiškia: 10 duomenų vienetų atsitiktinai atrenkami iš duomenų bazės, jei jie nedubliuoja dabartinio ID.
Kas atrodo kaip paprastas reikalavimas sukėlė serverio pakabinti! Aukščiau pateikto kodo sugeneruotas SQL sakinys yra toks:
Įgyvendinimo planas yra toks:
Jei duomenų bazėje yra 1 milijonas duomenų, ar iš pradžių nereikėtų 999 999 duomenų, o tada paimti 10 duomenų vienetų iš tų 999 999 vienetų duomenų?
Paklauskite didelio vaikino iš DBA grupės ir gaukite atsakymą: "taipO Dieve, kad turi būti lėtas, ir jums reikia skambinti šį sql pareiškimą daug kartų.
Iš pradžių maniau, kad tai EF problema,Tiesą sakant, jei rašote tiesiogiai sql, nėra gero sprendimo。
Jei taip, prašau pamokyti mane!
|