Witam, moim zadaniem jest wybranie z plików xml 10 milionów rekordów i wrzucenie ich do bazy mysql. W tym celu napisałem aplikację desktopową i wszystko ładnie śmiga. Problemem jest jedynie czas. Przy obecnym programie te 10 milionów do bazy będę dodawał kilka tygodni. Wąskim gardłem jest to iż oprogramowanie z plikami xml uruchomione jest na moim dysku a baza mysql na serwerze zewnętrznym. Rekordy dodawane są w w transakcji. Teraz aby to przyspieszyć postanowiłem uruchomić program na kilku komputerach i przerobić aplikację na wielowątkową. Tak aby równocześnie dodawało kilka rekordów (jako, że większość czasu tracę na przesyłanie danych między serwerem a moim komputerem). Zastanawia mnie, czy jeśli jednocześnie będę dodawał rekordy z kilku wątków i komputerów to czy wszystko nie popsuje się. Chodzi mi głównie o fakt iż po dodaniu rekordu, pobieram jego id i wpisuje je do relacyjnej tabeli.
Będę wdzięczny za każdą propozycję przyspieszającą wszystkie operacje. Jako że baza jest mocno indeksowana to zastanawiam się jeszcze nad tym ile czasu będzie trwało dodawanie rekordów gdy w bazie będzie już ich kilka milionów.
Zamieszczam skrócony kod wszystkich operacji:
[Kod]
SqlObiekt = new MySqlCommand();
SqlObiekt.Connection = conn;
SqlObiekt.CommandType = CommandType.Text;
#region//sprawdzenie czy taki rekord istnieje
SqlObiekt.CommandText = "SELECT `id` FROM `book` WHERE `code`=@code";
SqlObiekt.Parameters.AddWithValue
conn.Open();
MySqlDataReader reader;
reader = SqlObiekt.ExecuteReader();
myBook.BookSQLID=-1;
if (reader.HasRows)
{
while (reader.Read())
{
myBook.BookSQLID = (int)reader["id"];
}
}
reader.Close();
#endregion
#region//sprawdzenie czy istnieje publisher
SqlObiekt.CommandText = "SELECT `id` FROM `publisher` WHERE `name`=@name";
SqlObiekt.Parameters.AddWithValue("name", myPublisher.PublisherName);
reader = SqlObiekt.ExecuteReader();
myPublisher.PublisherID = -1;
if (reader.HasRows)
{
while (reader.Read())
{
myPublisher.PublisherID = (int)reader["id"];
}
}
reader.Close();
#endregion
#region//sprawdzenie czy istnieje autor
foreach (Author aut in myAuthorList)
{
SqlObiekt.Parameters.Clear();
SqlObiekt.CommandText = "SELECT `id` FROM `author` WHERE `name`=@authorName AND `surname`=@authorSurname";
SqlObiekt.Parameters.AddWithValue("authorName", aut.NamesBeforeKey);
SqlObiekt.Parameters.AddWithValue("authorSurname", aut.KeyNames);
reader = SqlObiekt.ExecuteReader();
aut.AuthorID=-1;
if (reader.HasRows)
{
Edytowano 3 razy. Ostatnio 2011-04-17 14:42:21 przez kobr.