asp.net Web サービス アプリケーションでバックグラウンド スレッドを実行しています。このスレッドの役割は、特定の時間後にデータベースにアクセスし、キャッシュ内のデータ テーブルを更新することです。データ テーブルには約 50 万行あります。タスク マネージャーでプロセスを調べると、Web 開発サーバーは初めて約 300,000K を消費し、次回は 500,000K になり、1,000,000K を超えることもあり、500,000-600,000K に戻ることもあります。ローカルマシンで作業しているため、データベースのデータは変更されていません。コードで私が間違っていることを教えてください。
protected void Application_Start(object sender, EventArgs e)
{
Thread obj = new Thread(new ThreadStart(AddDataInCache));
obj.IsBackground = true;
obj.Start();
}
private void AddDataInCache()
{
Int32 iCount = 0;
while (true)
{
MyCollection _myCollection = new MyCollection();
DataTable dtReferences = null;
DataTable dtMainData = null;
try
{
dtMainData = _myCollection.GetAllDataForCaching(ref dtReferences);
HttpRuntime.Cache.Insert("DATA_ALL_CACHING", dtMainData, null,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.Default, null);
HttpRuntime.Cache.Insert("DATA_REFERENCES_CACHING", dtReferences, null,
Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable, null
);
}
catch (Exception ex)
{
}
finally
{
if (_myCollection != null)
_myCollection = null;
}
iCount++;
Thread.Sleep(18000);
}
}
で、データ アクセス レイヤーから次のGetAllDataForCaching
ように取得しています。SqlDataReader
public DataTable GetAllDataForCaching(ref DataTable dReferenceTable)
{
DataTable dtReturn = new DataTable();
SqlDataReader dReader = null;
try
{
dReader = SqlHelper.ExecuteReader(CommandType.StoredProcedure, "[GetDataForCaching]", null);
if (dReader != null && dReader.HasRows)
{
dtReturn.Load(dReader);
dReferenceTable = new DataTable();
if (dReader.HasRows)
{
DataTable dtSchema = dReader.GetSchemaTable();
List<DataColumn> listCols = new List<DataColumn>();
if (dtSchema != null)
{
foreach (DataRow drow in dtSchema.Rows)
{
string columnName = System.Convert.ToString(drow["ColumnName"]);
DataColumn column = new DataColumn(columnName, (Type)(drow["DataType"]));
column.Unique = (bool)drow["IsUnique"];
column.AllowDBNull = (bool)drow["AllowDBNull"];
column.AutoIncrement = (bool)drow["IsAutoIncrement"];
listCols.Add(column);
dReferenceTable.Columns.Add(column);
}
}
while (dReader.Read())
{
DataRow dataRow = dReferenceTable.NewRow();
for (int i = 0; i < listCols.Count; i++)
{
dataRow[((DataColumn)listCols[i])] = dReader[i];
}
dReferenceTable.Rows.Add(dataRow);
}
}
}
}
finally
{
if (dReader != null)
{
if (dReader.IsClosed == false)
dReader.Close();
dReader = null;
}
}
return dtReturn;
}
Visual Studio 2008 を使用しています。