Σήμερα, ο διακομιστής υπέστη επίθεση CC, με αποτέλεσμα ο ιστότοπος στις υπηρεσίες IIS να κολλήσει και ο ιστότοπος έκλεισε ξανά μετά την επανεκκίνηση, ελέγξτε το αρχείο καταγραφής σφαλμάτων ιστότοπου ως εξής:
System.Data.Entity.Core.EntityCommandExecutionException: 执行命令定义时出错。有关详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException: 执行超时已过期。完成操作之前已超时或服务器未响应。 ---> System.ComponentModel.Win32Exception: 等待的操作过时。
Ένας μεγάλος αριθμός εξαιρέσεων χρονικού ορίου ερωτήματος προκαλεί την παύση λειτουργίας του ιστότοπου και οι δηλώσεις SQL χρονικού ορίου ερωτήματος προέρχονται όλες από μια μέθοδο λήψης τυχαίων δεδομένων, ο κώδικας έχει ως εξής:
Ο κωδικός σημαίνει περίπου: 10 κομμάτια δεδομένων επιλέγονται τυχαία από τη βάση δεδομένων, αρκεί να μην αντιγράφουν το τρέχον αναγνωριστικό.
Αυτό που φαίνεται σαν μια απλή απαίτηση έχει προκαλέσει το κλείσιμο του διακομιστή! Η δήλωση SQL που δημιουργείται από τον παραπάνω κώδικα είναι η εξής:
Το σχέδιο εφαρμογής έχει ως εξής:
Εάν η βάση δεδομένων έχει 1 εκατομμύριο δεδομένα, δεν θα χρειαζόταν πρώτα 999.999 κομμάτια δεδομένων και μετά θα έπαιρνε 10 κομμάτια δεδομένων από αυτά τα 999.999 κομμάτια δεδομένων;
Ρωτήστε τον μεγάλο τύπο της ομάδας dba και λάβετε την απάντηση: "ΝαιΘεέ μου, αυτό πρέπει να είναι αργό και πρέπει να καλέσετε αυτήν τη δήλωση sql πολλές φορές.
Στην αρχή νόμιζα ότι ήταν πρόβλημα EF,Στην πραγματικότητα, αν γράφετε απευθείας σε sql, δεν υπάρχει καλή λύση。
Αν ναι, σε παρακαλώ δίδαξέ με!
|