Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα συγχρονισμού κλήσεων στη βάση

Îåêßíçóå áðü ôï ìÝëïò dookie. Τελευταία δημοσίευση από το μέλος dookie στις 20-05-2010, 04:33. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-05-2010, 02:30 58639

    Πρόβλημα συγχρονισμού κλήσεων στη βάση

    Διαχειρίζομαι 2 βάσεις MS sql με 2 stored procedures απο 1 server side κώδικα. To 1o SP εκτελεί μια αναζήτηση στη βάση Α που έχει πολλές εγγραφές και είναι πολύ αργή η ανάκτηση (aνακτά ενα Varchar).
    Το 2ο καλείται επίσης απ' την ίδια WebMethod, χρησιμοποιεί τo αποτέλεσμα του 1ου  και το αποθηκεύει στη μαζί με άλλα δεδομένα στα πεδία της βάση Β. Το πρόβημα είναι ότι η εγγραφή στη βάση Β γίνεται χωρίς να αποθηκεύεται στο πεδίο που πρέπει η τιμή που έχει ανακτηθεί απ' το SP1.

    Το πρόβλημα δυσχερένεται και απ' το γεγονός ότι η WebMethod που έχει τα 2 SP καλείται συνεχώς ασύγχρονα απ' μια html.
    Οι βάσεις δεν είναι σε δίκτυο, αλλα localhost.

    Any ideas?
  •  12-05-2010, 08:16 58640 σε απάντηση της 58639

    Απ: Πρόβλημα συγχρονισμού κλήσεων στη βάση

    Δεν έχεις δώσει κανένα στοιχείο πέρα από το ότι το ένα stored procedure είναι αργό. Έτσι δεν είναι δυνατό να σε βοηθήσει κανείς. 

    Τί κάνουν αυτά τα stored procedures? Τί κάνει το web service? Γιατί νομίζεις ότι το πρόβλημα είναι στη βάση και όχι στο web service? Γιατί να έχει σημασία ποιός καλεί και πως καλεί το Webmethod? Τί εννοείς "έχει πολλές εγγραφές" και γιατί αυτό να προκαλεί καθυστέρηση? 1-2 εκατομμύρια π.χ. σε ένα πίνακα? Λιγότερα? Μήπως απλά ξέχασες να περάσεις την τιμή που γυρίζει το ένα stored procedure στο δεύτερο?

    Η ανάκτηση ενός varchar πάντως δεν  προκαλεί καμμία καθυστέρηση σε σχέση με οποιοδήποτε άλλο τύπο. Αν βλέπεις καθυστέρηση θα πρέπει να ελέγξεις τί κάνεις με το stored procedure και πως είναι σχεδιασμένη η βάση σου. Μπορεί να μην έχεις indexes, μπορεί να χρησιμοποιείς cursors αντί select ή κάτι άλλο περίεργο. 

    Χωρίς καμμία πληροφορία όμως δεν γίνεται να βοηθήσει κάποιος

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  18-05-2010, 19:56 58730 σε απάντηση της 58640

    Απ: Πρόβλημα συγχρονισμού κλήσεων στη βάση

    Το αργό stored procedure έχει πολλά nested selects πάνω σε tables με πάνω από 1.000.000 στοιχεία... Το Web Service δεν έχει κανένα πρόβλημα αφού όλος ο κώδικας έχει γραφτεί σε κλάσεις και μεθόδους που τις καλώ ανεξάρτητα.
  •  18-05-2010, 21:21 58731 σε απάντηση της 58730

    Απ: Πρόβλημα συγχρονισμού κλήσεων στη βάση

    Κοίτα, αν το Web Service δούλευε σωστά, θα αποθήκευε στη βάση τις τιμές που δίνεις στο δεύτερο stored procedure. Οπότε ή το δεύτερο stored procedure έχει πρόβλημα ή το web service δεν καλεί το stored procedure, ή δεν περνάει τις σωστές παραμέτρους. Το πρώτο stored procedure θα έπαιζε ρόλο μόνο αν λόγο της καθυστέρησης έκανε timeout η κλήση του και το web service δεν το χειριζόταν σωστά. Ή μπορεί να κάνει το ίδιο το web service timeout περιμένοντας να τελειώσει το πρώτο stored procedure.

    Επαναλαμβάνω πάντως ότι 1000000 εγγραφές είναι λίγες. Αν βλέπεις καθυστέρηση είναι είτε επειδή δεν είναι γραμμένο σωστά το query, είτε επειδή δεν έχεις τα σωστά indexes ή και τα δύο.

    Δοκίμασες να κάνεις debug το web service? Έχεις βάλει logging να δεις τί καλείται και πότε? Έχεις βάλει exception handling για να χειριστείς τυχόν timeouts ή άλλα λάθη? Τί συμβαίνει όταν εμφανίζεται το πρόβλημα? Μπορείς να μας δείξεις τον κώδικα που καλεί τα δύο stored procedures?

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-05-2010, 04:33 58750 σε απάντηση της 58731

    Απ: Πρόβλημα συγχρονισμού κλήσεων στη βάση

    Στο πρώτο κομμάτι κώδικα εκτελείται το SP returnSpath που επιστρέφει μια μόνο τιμή. Η τιμή αυτή αυτή θέλω να περνά στην κλήση της πιο κάτω μεθόδου για να εκτελεστεί απο το επόμενο SP που κάνει πολλαπλά inserts, όμως αυτό δεν συμβαίνει..
    Ο κώδικας είναι συνοπτικός:

     public class WebService1 : WebService
        {

            [WebMethod]
            public string myFun(string input)
            {
            .
            .
            .
    for (int m = 0; m < k ; m ++)
                {
    SqlConnection connection = new SqlConnection("Data Source=637822591E;Initial Catalog=dz;Integrated Security=True;");

                    //SqlCommand command = new SqlCommand("SELECT value FROM tblTable", connection);
                    SqlCommand command = new SqlCommand("returnSpath", connection);
                    command.CommandType = CommandType.StoredProcedure;
                    SqlParameter param = command.Parameters.Add("@var1", SqlDbType.VarChar);
                    param.Value = var1;
                    connection.Open();

                    SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection);
                    try
                    {
                        while (reader.Read())
                        {
                            cat = String.Copy(Convert.ToString(reader[0]));
                        }
                    }
                    catch
                    {
                        throw;
                    }
                    finally
                    {
                        #region Cleanup

                        command.Connection.Close();
                        command.Connection.Dispose();
                        command.Dispose();

                        #endregion
                    }


                    Async.BeginDataBaseCall(category, var1, var2, var3, var4, var5)
    }

                return var2;
            }

    ____________________________________________________________________________________________________________-

    public static class Async
        {
            #region Async Database Call - Two Methods
            public static void BeginDataBaseCall(string categ, int var1, string var2, int var3, string var4, string var5)
            {
               
                SqlConnection connection = new SqlConnection("Data Source=637822591E;Initial Catalog=teliko;Integrated Security=True");

                SqlCommand command = new SqlCommand("AllInserts", connection);
                command.CommandType = CommandType.StoredProcedure;
                SqlParameter var1_param = command.Parameters.Add("@var1", SqlDbType.Int);
                SqlParameter var2_param = command.Parameters.Add("@var2", SqlDbType.VarChar);
                SqlParameter var3_param = command.Parameters.Add("@var3", SqlDbType.Int);
                SqlParameter var4_param = command.Parameters.Add("@var4", SqlDbType.VarChar);
                SqlParameter var5_param = command.Parameters.Add("@var5", SqlDbType.Text);
                SqlParameter categ_param = command.Parameters.Add("@categ", SqlDbType.VarChar);
                SqlParameter time_param = command.Parameters.Add("@time", SqlDbType.DateTime);
                var1_param.Value = var1;
                var2_param.Value = var2;
                var3_param.Value = var3;
                var4_param.Value = var4;
                var5_param.Value = var5;
                categ_param.Value = categ;
                time_param.Value = DateTime.Now;
                connection.Open();

                command.ExecuteNonQuery();



                #region Cleanup

                command.Connection.Close();
                command.Connection.Dispose();
                command.Dispose();

                #endregion

                //command.BeginExecuteNonQuery(EndDatabaseCall, command);

            }

            #endregion


        }
    Το πρόβλημα φαίνεται να είναι στο πέρασμα των παραμέτρων.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems