Vandaag kreeg de server te maken met een CC-aanval, waardoor de website op IIS vastliep, en de website werd opnieuw opgehangen na het herstarten; bekijk het foutlogboek van de website als volgt:
System.Data.Entity.Core.EntityCommandExecutionException: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 执行超时已过期。完成操作之前已超时或服务器未响应。 ---> System.ComponentModel.Win32Exception: 等待的操作过时。
Een groot aantal query-timeout-uitzonderingen zorgt ervoor dat de website vastloopt, en de querytimeout SQL-statements komen allemaal voort uit een methode waarbij willekeurige data wordt verzameld; de code is als volgt:
De code betekent ongeveer: 10 stukjes data worden willekeurig uit de database geselecteerd, zolang ze de huidige ID niet dupliceren.
Wat lijkt op een simpele vereiste heeft ervoor gezorgd dat de server is vastgelopen! De SQL-instructie die door bovenstaande code wordt gegenereerd, is als volgt:
Het implementatieplan is als volgt:
Als de database 1 miljoen datastukken heeft, zou die dan niet eerst 999.999 datastukken nemen, en daarna 10 datastukken uit die 999.999 data?
Vraag het aan de grote man van de DBA-groep en krijg het antwoord: "jaOh mijn God, dat moet traag zijn, en je moet deze SQL-instructie vaak aanroepen.
In eerste instantie dacht ik dat het een EF-probleem was,Sterker nog, als je direct in SQL schrijft, is er geen goede oplossing。
Zo ja, leer het me alsjeblieft!
|