2014-10-31 83 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