2017-04-12 82 views
0

我有3個SQL查詢按照下面的方式運行,目前我正在按順序運行它們中的每一個,我希望探索在C#中並行運行它們的選項。我想知道C#有沒有這種可能性?它甚至可以做到嗎?如何在C#中並行執行SQL查詢?

sql1 = select DISTINCT A.Name 
     from masterdata.Areas as A, 
      ................... 
     and SPB.SoftwareProductBuild = 'build1' 

sql1 = select DISTINCT A.Name 
     from masterdata.Areas as A, 
     ................... 
     and SPB.SoftwareProductBuild = 'build2' 

sql1 = select DISTINCT A.Name 
     from masterdata.Areas as A, 
     ................... 
     and SPB.SoftwareProductBuild = 'build3' 

SqlCommand cmd = new SqlCommand(sql1, odsConn); 

SqlDataReader rdr = cmd.ExecuteReader(); 
rdr.Read(); 

if (rdr.HasRows) 
{ 
} 

SqlCommand cmd = new SqlCommand(sql2, odsConn); 
SqlDataReader rdr = cmd.ExecuteReader(); 

rdr.Read(); 

if (rdr.HasRows) 
{ 
} 

SqlCommand cmd = new SqlCommand(sql3, odsConn); 

SqlDataReader rdr = cmd.ExecuteReader(); 
rdr.Read(); 

if (rdr.HasRows) 
{ 
} 
+0

使用線程也許 – GurV

+0

使用異步等待,這是唯一的和最好的解決方案 –

+0

據我所知,並行查詢依賴於數據庫服務器。即使您的應用程序同時向數據庫服務器發送查詢,也會決定如何執行它們。 – afaolek

回答

0

我會先修改你的代碼,這樣它就會調用ThreadPool線程,使用Task,這是不是最好的方式,但仍然會讓它parallel,那麼我會建議一個更好的機制,使用Dapper Micro ORM,這使其處理起來非常簡單。什麼我做的是包裝您的查詢在不同的任務,在他們每個人的調用一個單獨的線程,需要單獨的連接對象,將在並行

Task t1 = Task.Run(() => { 
SqlCommand cmd1 = new SqlCommand(sql1, odsConn1); 

SqlDataReader rdr1 = cmd1.ExecuteReader(); 
rdr1.Read(); 

if (rdr1.HasRows) 
{ 
} 
}); 

Task t2 = Task.Run(() => { 
SqlCommand cmd2 = new SqlCommand(sql2, odsConn2); 
SqlDataReader rdr2 = cmd2.ExecuteReader(); 

rdr2.Read(); 

if (rdr2.HasRows) 
{ 
} 
}); 

Task t3 = Task.Run(() => { 
SqlCommand cmd3 = new SqlCommand(sql3, odsConn3); 

SqlDataReader rdr3 = cmd3.ExecuteReader(); 
rdr3.Read(); 

if (rdr3.HasRows) 
{ 
} 
}); 

執行現在,您可以等待任務爲完成:

在同步方法:

Task.WaitAll(t1,t2,t3); 

在一個異步方法:,要聲明async

await Task.WhenAll(t1,t2,t3); 

要點需要方法:

  1. 這是不換行IO /遠程調用的任務,因爲它會調用一個線程池線程,一個好的做法只需發送一個電話並等待。
  2. 更好的機制是使用固有的Async APIsDbDataReaderDbConnection有異步API。因爲這需要在後臺進行處理,因此不使用像Thread這樣的資源。
  3. 注意我用的每個查詢一個單獨的Connection對象,因爲這不是線程安全的,安全的將需要異步API的,在平行

更好的方式來執行它們:

使用像Dapper這樣的Micro ORM,在擴展IDbConnection方面做得非常好,並公開了異步API,如QueryAsync,它將返回結果Task<IEnumerable<T>>,雖然它需要整個鏈標記爲async,並且需要單獨的Connection,但可以有效地處理多個電話高效。與SqlClient不同,它節省了創建IEnumerable的努力,從DataReader or Dataset

0

將它作爲UNIONWHERE SPB.SoftwareProductBuild IN ('build1', 'build2','build3')並讓數據庫對它進行排序。
更有效地利用連接,網絡,腦力和CPU。