我参与了一个项目,该项目要求在Mysql中使用46个以上的新表更新14k数据库模式。这些附加表的创建脚本平均每个模式运行42秒。当以单线程方式运行时,没有问题,但为了避免花费一周+来完成更新,我们有一个多线程处理更新脚本应用程序的工具。这是在C#中使用microsoft的Parallel.ForEach完成的,并且对线程数设置了限制。目前,如果我将它推过4个线程,数据库会定期开始响应致命错误,当进行挖掘时,显示在等待响应时主机强行关闭连接。连接超时设置为120000,默认命令超时也设置为120000.(我尝试将此更改为int.MaxValue,没有明显区别)数据库设置为'wait_timeout'为28800,'interactive_timeout'设置为28800为好。
例外的相关部分是:
MySql.Data.MySqlClient.MySqlException(0x80004005):命令执行期间遇到致命错误。 ---> MySql.Data.MySqlClient.MySqlException(0x80004005):尝试读取结果集时遇到致命错误。 ---> MySql.Data.MySqlClient.MySqlException(0x80004005):从流中读取失败。 ---> System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭现有连接。
用于运行脚本的代码如下:
using (MySqlConnection conn = new MySqlConnection(connectionString))
{
conn.Open();
using (MySqlTransaction trans = conn.BeginTransaction())
{
using (MySqlCommand command = conn.CreateCommand())
{
command.CommandText = initialCommandText + query;
command.ExecuteNonQuery();
}
trans.Commit();
}
}
初始命令文本只是“使用some_schema_name; \ r \ n”
行如果有人有任何想法或潜在的设置我可以操作以提高吞吐量,我们将不胜感激!