我編寫了一些用於創建數據庫的服務,在數據庫或表等中複製了一些記錄,所以有很多數據庫操作。但即時通訊處理內存問題。其中之一:使用存儲過程時出現「內存不足」錯誤
即時通訊存儲程序和填寫實體清單記錄;
public List<FpBatteryEntity> LoadFPBattery()
{
List<FpBatteryEntity> retVal = new List<FpBatteryEntity>();
DataSet dataSet = _dataAccessProvider.ExecuteSPDataSet("sp_fp_battery", null);
if (dataSet != null && dataSet.HasData())
{
DataTable requestsTable = dataSet.Tables[0];
if (requestsTable != null && requestsTable.HasData())
{
foreach (DataRow row in requestsTable.Rows)
{
FpBatteryEntity entity = new FpBatteryEntity()
{
Faceplate = row["tf_faceplate"],
Battery = row["tf_battery"]
};
retVal.Add(entity);
}
}
}
return retVal;
}
然後對於列表中的每個實體,執行一個新的sp;
public bool LoadFPBattery(List<FpBatteryEntity> entityList)
{
foreach (var entity in entityList)
{
DBParameterCollection parameters = new DBParameterCollection
{
new DBParameter("@faceplate", SqlDbType.VarChar, entity.Faceplate),
new DBParameter("@battery", SqlDbType.VarChar, entity.Battery)
};
_dataAccessProvider.ExecuteSPNonQuery("sp_ins_fp_battery", parameters);
}
return true;
}
不幸的是,我有超過30個這樣的操作,其中一些操作正在處理數千條記錄。
調用這樣的步驟;
.....
List<MapColorEntity> mapColor = _dbRepository.LoadMapColor(marketId);
if (!_otherDbRepository.LoadMapColor(mapColor))
return false;
List<AttributesEntity> attributes = _dbRepository.LoadOptionAttrib(marketId);
if (!_otherDbRepository.LoadOptionAttrib(OptionAttributes))
return false;
List<FpBatteryEntity> fpBattery = _dbRepository.LoadFPBattery();
if (!_otherDbRepository.DelFPBattery())
return false;
if (!_otherDbRepository.LoadFPBattery(fpBattery))
return false;
.....
後5-6步驟操作與破壞 「內存不足」錯誤。我必須逐步完成這些所有操作。只是想知道如果你有建議讓這些操作更加富有成效和流暢。我如何解決這個記憶問題?後面會發生什麼?
用法;
Windows 7操作系統,可用的3Gb拉姆,Sybase ASE的,ODBC驅動程序
您是否真的需要將這些查詢中的每一個查詢的每一行加載到內存中?你不能流式傳輸結果,以至於你一次只能在內存中保留一小部分內存?另外,不要爲整個應用程序使用一個數據庫上下文;爲每筆交易創造一個新的;它將有助於降低你的內存佔用。 – Servy 2013-05-06 13:57:05
@servy,流式結果可能會達到目的,我會試試看。但我的代碼會更復雜,不會? – htcdmrl 2013-05-07 10:43:45
並不顯着,這取決於你在做什麼。使用'IEnumerable'而不是'List'並將這些方法轉換爲迭代器塊(這實際上簡化了它們,而不是使它們複雜化)。 – Servy 2013-05-07 13:54:23