一个数据库中,我需要将表A中的300万数据逐条处理后,写入表B,用C# 写了个小工具,但执行30分钟左右时就报错,报错内容如下:
MySql.Data.MySqlClient.MySqlException (0x80004005): Fatal error encountered during data read. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Reading from the stream has failed. ---> System.IO.IOException: 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。 ---> System.Net.Sockets.SocketException: 远程主机强迫关闭了一个现有的连接。
部分代码如下:
public static MySqlConnection getMySqlCon()
{
String mysqlStr = "Database=xxx;Data Source=localhost;User Id=root;Password=root;pooling=false;CharSet=utf8";
MySqlConnection conn = new MySqlConnection(mysqlStr);
conn.Open();
return conn;
}
MySqlConnection mysql = getMySqlCon();
String sqlSearch = "select * from xxxxxx";
MySqlCommand mySqlCommand = getSqlCommand(sqlSearch, mysql);
getResultset(mySqlCommand);
mySqlCommand.Dispose();
mysql.Close();
mysql.Dispose();
public static void getResultset(MySqlCommand mySqlCommand)
{
MySqlDataReader reader = mySqlCommand.ExecuteReader();
try
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
while (reader.Read())
{
if (reader.HasRows)
{
省略部分代码.....
MySqlConnection mysql2 = getMySqlCon();
String news_inster = "省略SQL语句....";
String news_update = "省略SQL语句... ";
String data_inster = "省略SQL语句...;
String index_inster = "省略SQL语句...";
Console.WriteLine(news_inster);
Console.WriteLine(news_update);
Console.WriteLine(data_inster);
Console.WriteLine(index_inster);
MySqlCommand mySql_news_inster = getSqlCommand(news_inster, mysql2);
MySqlCommand mySql_news_update = getSqlCommand(news_update, mysql2);
MySqlCommand mySql_data_inster = getSqlCommand(data_inster, mysql2);
MySqlCommand mySql_index_inster = getSqlCommand(index_inster, mysql2);
getInsert(mySql_news_inster);
getUpdate(mySql_news_update);
getInsert(mySql_data_inster);
getInsert(mySql_index_inster);
mySqlCommand.Dispose();
mysql2.Close();
mysql2.Dispose();
}
}
sw.Stop();
Console.WriteLine("写入完成,共花费时间:Time elapsed: {0}", sw.Elapsed);
Console.ReadKey();
}
catch (Exception ex)
{
LogHelper.WriteLog(typeof(Program), ex);
}
finally
{
reader.Close();
}
Console.ReadKey();
}
感觉是内存耗尽了!!!!,具体错误请各位牛帮忙分析一下!!!
为什么不用LOAD DATA INFILE呢,先将A表的数据导出来生成数据文件,再用LOAD DATA INFILE导入到B表。
参考自:
LOAD DATA INFILE用法详解 http://www.data.5helpyou.com/article408.html