性能提高及事務進程死鎖問題


總結.,在硬件資源可以滿足情況的情況下,提高性能 兩個途徑,或結合使用

1.多線程

2.緩存

3多進程

 

更新(最近的心得2011.9.6)

1.將類定義為靜態,靜態的字段可在靜態構造函數中初始化,而它在整個應用程序中只執行一次,以后每次有新的訪問者時都不需要重新實例化
2.使用數據庫提供器工廠,以實現通用的數據訪問代碼。實現了不同的數據庫數據操作的通用性,使代碼更具有具有可擴展性、兼容性
3.構造一個靜態配置類,緩存常用的需要從web.config中讀取的,如將連接字符串從類的靜態構造函數中讀取出來,使得web.config文件不會在每次數據庫操作時都被讀取一次,而僅在類被初始化時讀取該文件。
4.少於16字節的數據,用結構(值類型,不是存儲在棧中)進行處理的的效率要高於類。
5.使用鏈接工廠

 

在提高工作效率的情況下,遇到了下面的問題:

System.Data.SqlClient.SqlException: 事務(進程 ID  58)與另一個進程已被死鎖在  lock 資源上,且該事務已被選作死鎖犧牲品。請重新運行該事務。
   在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
   在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   在 System.Data.SqlClient.SqlDataReader.get_MetaData()
   在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   在 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet)
   在 InformationCollection.DataAccess.SqlHelper.ExecuteDataset(SqlConnection connection, CommandType commandType, String commandText, SqlParameter[] commandParameters) 位置 D:\My Documents\Programing\項目\InformationCollection\InformationCollection\DataAccess\SQLHelper.cs:行號 612
   在 InformationCollection.DataAccess.SqlHelper.ExecuteDataset(SqlConnection connection, CommandType commandType, String commandText) 位置 D:\My Documents\Programing\項目\InformationCollection\InformationCollection\DataAccess\SQLHelper.cs:行號 581
   在 InformationCollection.DataAccess.DateUrlDal.GetMuchData() 位置 D:\My Documents\Programing\項目\InformationCollection\InformationCollection\DataAccess\DateUrlDal.cs:行號 71
   在 InformationCollection.Form1.StartMainThread() 位置 D:\My Documents\Programing\項目\InformationCollection\InformationCollection\Form1.cs:行號 97

 

原因:有時候並不一定真正的死鎖,此處錯誤的原因,是因為一進程一直占有數據庫資源,其它進程得不到資源一直處於飢餓狀態造成的。

解決,以下兩個方法都可行,已經驗證過:1在內存中開辟一塊數據域作為緩存,挖掘CPU潛能

2。針對錯誤,找到根源,此處解決是給數據表加索引,使進程只能鎖定數據表中的一行,而不是整個表

 


 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com