पर्यावरण:ADO.Net SQLCommand.ExecuteReader() को धीमा कर देती या लटका हुआ है
आवेदन (नेट 4 के लिए सी # में लिखा) 10 धागे अप करने के लिए है, इसलिए प्रत्येक धागा अपनी ही AppDomain में चलता है। प्रत्येक थ्रेड एक ADO.Net DataReader का उपयोग करता है जो SQL-Server 2008 पर संग्रहीत प्रक्रिया से परिणाम प्राप्त करता है। इसके अलावा एक थ्रेड एडीओ.Net का उपयोग लिखने के संचालन (थोक सम्मिलन) करने के लिए कर सकता है। सब कुछ स्थानीय मशीन पर चलता है।
समस्या # 1:
कभी कभी (लगभग प्रत्येक 30 रन) एक धागे के निष्पादन के नीचे काफी धीमा कर देती है। ऐसा तब होता है जब DataReader संग्रहीत प्रक्रिया परिणाम प्राप्त करता है - SqlCommand.ExecuteReader()। आम तौर पर पढ़ना ऑपरेशन 10 सेकंड में निष्पादित करता है। जब यह धीमा हो जाता है, तो यह 10-20 मिनट में निष्पादित होता है। एसक्यूएलप्रोफाइलर दिखाता है कि आंकड़े पूछे जा रहे हैं, हालांकि बहुत धीरे-धीरे।
मंदी की Callstack (कृपया ध्यान दें कोई अपवाद नहीं हैं कि):
at SNIReadSync(SNI_Conn* , SNI_Packet** , Int32)
at SNINativeMethodWrapper.SNIReadSync(SafeHandle pConn, IntPtr& packet, Int32 timeout)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
at System.Data.SqlClient.TdsParserStateObject.ReadByteArray(Byte[] buff, Int32 offset, Int32 len)
at System.Data.SqlClient.TdsParserStateObject.ReadString(Int32 length)
at System.Data.SqlClient.TdsParser.ReadSqlStringValue(SqlBuffer value, Byte type, Int32 length, Encoding encoding, Boolean isPlp, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer value, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ReadColumnData()
at System.Data.SqlClient.SqlDataReader.ReadColumnHeader(Int32 i)
at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout)
at System.Data.SqlClient.SqlDataReader.GetValueInternal(Int32 i)
at System.Data.SqlClient.SqlDataReader.GetValue(Int32 i)
at System.Data.SqlClient.SqlDataReader.get_Item(String name)
at ****.Core.TableDataImporter.ImportDataFromExcel(Int32 tableId, ExcelEntityLocation location, Boolean& updateResult) in …
समस्या # 2:
के बजाय एक नीचे एक धागा धीमा लटका कर सकते हैं।
Callstack:
at SNIReadSync(SNI_Conn* , SNI_Packet** , Int32)
at SNINativeMethodWrapper.SNIReadSync(SafeHandle pConn, IntPtr& packet, Int32 timeout)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
at System.Data.SqlClient.TdsParserStateObject.ReadBuffer()
at System.Data.SqlClient.TdsParserStateObject.ReadByte()
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader()
Callstacks पृष्ठभूमि सूत्र में डिबग उपकरण का उपयोग कर प्राप्त हुए थे। कोई अपवाद नहीं होता है, या तो मंदी या लटकती है।
SNIReadSync एक तंत्र है जो नेटवर्क स्तर पर काम करता है और नेटवर्क पर पैकेट ट्रांसमिट करने के साथ काम करता है। हमने इस समस्या को स्थानीय मशीन पर पुन: उत्पन्न किया है, समीकरण से नेटवर्क समस्याओं को हटा दिया है।
हम इस मंदी/लटका अप के लिए किसी भी इनपुट और समाधान या कामकाज की तलाश में हैं। अभी के लिए हम मंदी का पता लगाने की योजना बना रहे हैं। अग्रिम में धन्यवाद।
मैं विधि के लिए सरलीकृत कोड जोड़कर कर रहा हूँ के रूप में अनुरोध किया:
public void ImportDataFromExcel()
{
try
{
var _сonnectionBuilk = ... ; // singleton connection (at the app level)
var spName = ... ; // stored procedure name
var сonnectionToRead = new SqlConnection(connectionStirng);
сonnectionToRead.Open();
var sqlCommand = new SqlCommand(spName);
sqlCommand.CommandType = CommandType.StoredProcedure;
sqlCommand.Parameters.Add(param1Name, SqlDbType.Int).Value = ...;
sqlCommand.Parameters.Add(param2Name, SqlDbType.Int).Value = ...;
sqlCommand.Parameters.Add(param2Name, SqlDbType.Int).Value = ...;
sqlCommand.Connection = сonnectionToRead;
sqlCommand.CommandTimeout = timeout; // 120 sec
using (var dataReader = sqlCommand.ExecuteReader())
{
dataReader.Read();
.....
int pos1 = dataReader.GetOrdinal(columnName1);
int pos2 = dataReader.GetOrdinal(columnName2);
int pos3 = dataReader.GetOrdinal(columnName3);
int pos4 = dataReader.GetOrdinal(columnName4);
.....
// reading data from sqldatareader
int val1 = dataReader.GetInt32(pos1);
int val2 = dataReader.GetInt32(pos2);
int val3 = dataReader.GetInt32(pos3);
var val4 = dataReader.GetDateTime(pos4);
.....
// append read data into bulkTable
bulkTable.AddCellValue(val1, val2, val3, val4); // bulkTable wraps DataTable, and appends DataRow inside.
if(bulkTable.DataTable.Rows > MaxRowsCount)
{
using (var bulkCopy = new SqlBulkCopy(_сonnectionBuilk))
{
bulkCopy.DestinationTableName = _fullTableName;
bulkCopy.WriteToServer(bulkTable.DataTable);
}
var sqlCommandTransfer = new SqlCommand(spName);
sqlCommandTransfer.CommandType = CommandType.StoredProcedure;
sqlCommandTransfer.Parameters.Add(param1Name, SqlDbType.Int).Value = ...;
sqlCommandTransfer.Connection = _сonnectionBuilk;
....
sqlCommandTransfer.ExecuteNonQuery(); // transfering data from temp bulk table into original table
}
}
}
finally
{
bulkTable.Dispose();
сonnectionToRead.Close();
}
}
क्या आप कोड दिखा सकते हैं? खासकर जहां आप बना रहे हैं, openeing, कनेक्शन बंद और पाठक निष्पादित कर रहे हैं। –
यह डीबी पक्ष पर एक समस्या की तरह लगता है। क्या एसक्यूएल पर कुछ कार्यकर्ता प्रक्रिया है जो समय-समय पर चलती है? एक सिंच या कुछ क्रिया जो पंक्ति/टेबल लॉक उत्पन्न कर रही है? सारणी कितनी बड़ी है? किस प्रकार की अनुक्रमणिका/बाधाएं आदि – Brian
@TimSchmelter - मैंने लटकने वाले कोड को जोड़ दिया है। – Cortlendt