WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySql bulk insert, laddnings problem (https://www.wn.se/forum/showthread.php?t=1064514)

naak2803 2015-03-30 12:29

MySql bulk insert, laddnings problem
 
Hej,

Jag håller på att göra en bulk insert med ca 50,000 poster.

Kodsnutten för insert ser ut på detta vis.

Kod:

string strSql = "INSERT INTO wc_list (id, name, company, orgNo, address, postalCode, city, phoneNo, carrier, status, projectId) VALUES(id, @A, @B, @C, @D, @E, @F, @G, @H, @I, @J)";

        string strConnectionString = ConfigurationManager.ConnectionStrings["MySQL"].ConnectionString;
        MySqlConnection sqlConn = new MySqlConnection(strConnectionString);
        MySqlCommand cmd = new MySqlCommand(strSql, sqlConn);
        sqlConn.Open();

        foreach (DataRow r in dt.Rows)
        {
            cmd1 = sqlConn.CreateCommand();
            cmd.CommandText = strSql;
            cmd.Parameters.AddWithValue("@A", r[0]);
            cmd.Parameters.AddWithValue("@B", r[1]);
            cmd.Parameters.AddWithValue("@C", r[2]);
            cmd.Parameters.AddWithValue("@D", r[3]);
            cmd.Parameters.AddWithValue("@E", r[4]);
            cmd.Parameters.AddWithValue("@F", r[5]);
            cmd.Parameters.AddWithValue("@G", r[6]);
            cmd.Parameters.AddWithValue("@H", r[7]);
            cmd.Parameters.AddWithValue("@I", "0");
            cmd.Parameters.AddWithValue("@J", iProjectId);
           
            cmd.ExecuteNonQuery();
        }

        sqlConn.Close();

Problemet jag upplever är att vid, cmd.ExecuteNonQuery(), so ligger webläsaren och bara snurrar medans alla poster håller att insertas. Vilket kan bli jobbigt, vill kunna hålla på med andra saker samtidigt.

Just nu gör jag så att jag klickar på "INSERT-knappen" och sedan trycker jag direkt på ESC. Då kan jag surfa runt på sidan medans inserten håller på.

hur kan jag åstadkomma samma effekt programmatiskt? håller på att utveckla i c# .NET

tacksam för svar.

coredev 2015-03-30 12:52

Det beror på. En sätt är att lägga arbetet i en tråd och sedan hämta tillbaka status med SignlarR. Om det är Azure du utvecklar i så har du ju möjlighet att lägga dina arbeten i en kö som du sedan betar av med en worker-roll.

yakuzaemme 2015-03-30 16:10

Kör alla inserts i en och samma query. Dvs INSERT INTO table (, , ,) VALUES (val1,val2), (val3, val4) etc.

Tror max ligger på 500 i en och samma query, detta går att ändra men annars kan du bara köra olika batchar om 500 åt gången.

Knockout 2015-03-30 16:30

Som ovan säger, kör i batchar.
Istället för att köra 50.000 frågor mot databasen blir det bara 100 vilket inte bör ta många sekunder att köra.

yakuzaemme 2015-03-30 16:33

Såg nu att det rörde sig om 50k poster. Ändra max_allowed_packet och sätt in 10.000 om gången, bör gå kvickt :)

x264 2015-03-30 19:25

Jag hade använt mig av en insert med en select:


INSERT INTO users (username, password, firstname, lastname) SELECT username, salted_password, firstname, lastname FROM registered_users

Gjort detta enkelt med över 600 tusen poster.

Lycka till!

naak2803 2015-04-08 11:50

tack för alla som försökt hjälpa, testade alla dessa ovan, med det tog alltför långt tid att göra en insert... ca 60 sek... :S

Lyckades dock lösa problemet med denna kod, för er som är intresserade. Jag skapar en tillfällig csv fil och därefter gör jag en batch-insert från filen tilkl databasen.



Kod:

        string strConnectionString = ConfigurationManager.ConnectionStrings["MySQL"].ConnectionString;

        using (var conn = new MySqlConnection(strConnectionString))
        {
            var bl = new MySqlBulkLoader(conn)
            {
                TableName = "wc_list",
                FieldTerminator = "|",
                LineTerminator = "\r\n",
                FileName = getCSVfile(),
                NumberOfLinesToSkip = 0,
                Columns = { "name", "company", "orgNo", "address", "postalCode", "city", "phoneNo", "carrier", "status", "projectId", "other" }
            };
            var numberOfInsertedRows = bl.Load();
        }



Alla tider är GMT +2. Klockan är nu 05:38.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson