兩種資料庫二進位欄位存取控制方式的對比

來源:互聯網
上載者:User
二進位|控制|資料|資料庫 方式一:對於小容量的資料,進行一次載入記憶體,一次性擷取
/// <summary>
/// 小容量附件資料讀取效能測試
/// </summary>
/// <param name="strSql"></param>
/// <returns></returns>
public static bool ProcessDataFromDataBaseByAdapter(string strSql,out string strErr)
{
long t0 = Environment.TickCount;
DataTable table ;
if(!OleDataBaseProxy.ExecuteSql(strSql,out table,out strErr))return false;
long imageDataSizeCount = 0;
if(!CapabilityProxy.ProcessDataFromDataBase(ref table,out imageDataSizeCount,out strErr))return false;
long t1 = Environment.TickCount;
LogProxy.WriteLog("資料庫效能測試:總耗時 "+ Convert.ToString(t1-t0) +" ms,資料量:" + imageDataSizeCount.ToString() + " bytes");
strErr = "";
return true;
}
/// <summary>
/// 執行資料查詢操作
/// </summary>
/// <param name="strSql"></param>
/// <param name="table"></param>
/// <param name="strErr"></param>
/// <returns></returns>
public static bool ExecuteSql(string strSql,out System.Data.DataTable table,out string strErr)
{

System.Data.OleDb.OleDbConnection Cnn = new OleDbConnection();
Cnn.ConnectionString = ConfigProxy.GetValueByKey("OleConnectionString");
System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(strSql,Cnn);
table = new System.Data.DataTable();
try
{
adapter.Fill(table);
}
catch(Exception Err)
{
strErr = Err.Message;
return false;
}
strErr = "";
//釋放資源
Cnn.Dispose();
adapter.Dispose();
GC.Collect();
return true;
}
/// <summary>
/// 對資料庫記錄進行處理
/// </summary>
/// <param name="table"></param>
/// <param name="imageDataSizeCount"></param>
/// <param name="strErr"></param>
/// <returns></returns>
private static bool ProcessDataFromDataBase(ref DataTable table,out long imageDataSizeCount,out string strErr)
{
imageDataSizeCount = 0;
for(int i = 0;i < table.Rows.Count;i ++)
{
byte [] ImageContent = (byte[])table.Rows[i]["附件內容"];
imageDataSizeCount += Convert.ToInt64(table.Rows[i]["附件容量"]);
CapabilityProxy.ProcessImageData(ref ImageContent);
}
strErr = "";
return true;
}

方式二:線上進行,按指定尺寸分段擷取

/// <summary>
/// 大容量附件資料讀取效能測試
/// </summary>
/// <param name="strSql"></param>
/// <returns></returns>
public static bool ProcessDataFromDataBaseByReader(string strSql,out string strErr)
{
long t0 = Environment.TickCount;
long imageDataSizeCount = 0;
System.Data.OleDb.OleDbCommand cmd = new OleDbCommand();
OleDbConnection Cnn = new OleDbConnection(ConfigProxy.GetValueByKey("OleConnectionString"));
cmd.Connection = Cnn;
cmd.CommandText = strSql;
OleDbDataReader reader;
//開啟串連
try
{
Cnn.Open();
}
catch(Exception Err)
{
strErr = Err.Message;
return false;
}
byte[] pixels = new byte[numPixels];
long readCount = 0;
reader = cmd.ExecuteReader();
//逐條處理
while(reader.Read())
{
for(long i = 0; i< Convert.ToInt64(reader.GetString(7)); i = i + numPixels)
{
readCount = reader.GetBytes(6,i,pixels,0,numPixels);
if(readCount == 0)
{
break;
}
else if(readCount == numPixels)
{
ProcessImageData(ref pixels);
}
else
{
byte[]buff = new byte[readCount];
ProcessImageData(ref buff);
}
imageDataSizeCount += readCount;
}
}
reader.Close();
//關閉串連
if(Cnn.State == System.Data.ConnectionState.Open)
{
Cnn.Close();
}
long t1 = Environment.TickCount;
LogProxy.WriteLog("資料庫效能測試:總耗時 "+ Convert.ToString(t1-t0) +" ms,資料量:" + imageDataSizeCount.ToString() + " bytes");
//釋放資源
Cnn.Dispose();
cmd.Dispose();
GC.Collect();
strErr = "";
return true;
}
/// <summary>
/// 緩衝區大小
/// </summary>
public static int numPixels = int.Parse(ConfigProxy.GetValueByKey("BufferSize"));
/// <summary>
/// 處理器延時
/// </summary>
public static int processImageRepeats = int.Parse(ConfigProxy.GetValueByKey("CpuLateTime"));

兩種方式的比較:

第一種方式:減少資料庫壓力,資料大小已知
第二種方式:增加資料庫壓力,資料大小未知

總結:
根據實際應用情況進行選擇,在二進位欄位內容大小已知,資料庫負擔壓力比較大的情況下選擇第一種方式;在二進位欄位內容大小未知,資料庫負擔壓力較小的情況下選擇第二種方式。


相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。