2014-10-31 88 views
0

我目前正在重寫一箇舊的ASP \ ASP.NET應用程序。由於我不能完全重寫,我需要按部分進行。 現在我正在將代碼庫從ODBC升級到.net連接器。高性能mysql插入

每次用戶訪問頁面時都會有一個插入(或2)的函數。性能非常重要。這裏是老ODBC函數插入數據:

public string WriteDb(string sql) 
{ 
    myConnection.Close(); 
    myConnection.Open();  
    myCommand.Connection = myConnection; 
    myCommand.CommandText = sql; 
    return myCommand.ExecuteNonQuery().ToString(); 
} 

這裏是一個我工作:

void WriteDb(string sql, ICollection<MySqlParameter> pms) 
{ 
    using(MySqlConnection myConnection = new MySqlConnection(sConnection)) 
    { 
     using(MySqlCommand myCommand = myConnection.CreateCommand()) 
     { 
      myCommand.CommandText = sql; 
      foreach (var p in pms) 
      { 
       myCommand.Parameters.Add(mySqlParameter); 
       myCommand.ExecuteNonQuery(); 
      } 
     } 
    } 

我擔心連接池耗盡。我的功能可以改進嗎?

+1

爲什麼每次用戶訪問一個頁面時都會插入2個插入...你不能在服務器上創建一個緩存並每隔x分鐘進行一次插入嗎? – Steve 2014-10-31 18:35:29

回答

0

注1 - 查詢
我認爲,最大的變化之一是,你現在插入這樣的事情:

INSERT INTO tablename (KEY, KEY) VALUES (VALUE, VALUE); 
INSERT INTO tablename (KEY, KEY) VALUES (VALUE, VALUE); 

但更好的插入會:

INSERT INTO tablename (KEY, KEY) VALUES (VALUE, VALUE), (VALUE, VALUE); 

這不需要2個查詢和通信到數據庫,但只有1.
我不知道你是否有這樣的查詢。但它會提高性能。

注2 - 連接
你做你的每個查詢的新的MySqlConnection。建立連接是一個沉重的方法。緩存你的連接,直到你停止使用它,並在完成後關閉它,這將有很大的幫助!對於在頁面上執行的所有MySQL函數使用相同的連接可能更好。並關閉它在頁面的末尾。

+0

感謝您的建議。這用於位於不同服務器中的計數器樣式腳本,因此只有該頁面在該特定服務器中被請求。意思是,我應該也可以在本地緩存查詢,然後做一個批量插入或什麼(?) – Cornwell 2014-10-31 18:45:06

+1

我認爲如果你有一個簡單的插入查詢,開始連接是最重的執行。我會開始緩存連接5分鐘或其他東西,但不要忘記關閉它。否則,你將在你的mysql服務器上達到maxconnections限制。 – Niels 2014-10-31 18:48:15

+0

因此,如果我理解正確,我應該緩存連接句柄保持打開5分鐘,然後關閉它?然後在下一個請求中,創建一個新連接,將其緩存5分鐘等。或者,即使它被緩存,應該在使用後立即關閉它嗎? – Cornwell 2014-10-31 18:57:29