[C#] Połączenie się z MySQL i wykonanie wątków

0

Witam,

za pomocą C# połączyłem się z bazą danych w MySQL. Mogę wykonywać na niej bezproblemowo różne zapytania usuwające, dodające, zmieniające i wyświetlające dane.

Ogólnie program jest bardzo prosty, zawiera klasę z danymi, które dotyczą połączenia z bazą (takie jak host, nazwa użytkownika, hasło, itd.) oraz metody (np. metoda public void Insert() odpowiadająca za dodawanie nowych krotek).

Kolejną rzeczą, którą chcę zrobić jest uruchomienie kilku wątków, które w danym momencie wykonują równocześnie zapytanie. Tutaj mam problem, gdyż po raz pierwszy się z czymś takim spotykam i nie za bardzo wiem jak ruszyć. Czytałem sporo o programowaniu wielowątkowym i asynchronicznym, ale nie potrafię tego odnieść do mojego problemu. Będę wdzięczny za pomoc.

0

Jedno połączenie nie może być współdzielone między wątkami zatem trzeba użyć np. semaforów albo stworzyć oddzielne połączenie.

0

Niestety ale nic mi to nie mówi...

Trochę jeszcze o tym doczytałem i napisałem taki prosty program:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

class MyThread 
{ 
    static void Main() 
    { 
        Thread watek1 = new Thread(Funkcja); 
        Thread watek2 = new Thread(Funkcja); 
        Thread watek3 = new Thread(Funkcja); 
        Thread watek4 = new Thread(Funkcja); 
        Thread watek5 = new Thread(Funkcja); 

        watek1.Start(); 
        watek2.Start(); 
        watek3.Start(); 
        watek4.Start(); 
        watek5.Start(); 
        Console.Read(); 
    } 

    static void Funkcja() 
    { 
        Console.Write("B\n"); 
    } 

}

Czy o to właśnie chodzi w tym programowaniu wątkowym? Czy w moim programie kolejne sekcje watek1.Start(); ... watek5.Start(); uruchomią się równocześnie? Bo jeśli tak to w sumie byłbym w domu...

0

Uruchomią się po kolei tak jak są instrukcje. Potem "jednocześnie" będzie wypisywane coś na konsolę, bo obiekt konsoli sam synchronizuje jego użycie między wątkami, ale inaczej się to ma z połączeniem z bazą danych gdzie nie ma już automatycznej synchronizacji.

0

Czyli gdyby moją Funkcją było nie wypisywanie na konsole, ale np. zapytanie do bazy, to poniższa część kodu nie wykona się równocześnie? Co zatem zrobić, aby wszytko wykonało się na raz?

        watek1.Start(); 
        watek2.Start(); 
        watek3.Start(); 
        watek4.Start(); 
        watek5.Start();
0

Nie, nie wykona się równocześnie jedno zapytanie w jednym połączeniu z kilku wątków. Wszystko na raz, ale co masz na myśli? Jedno i to samo zapytanie przez kilka wątków? Bo w synchronizacji między wątkowej raczej chodzi o różne zapytania na jednym połączeniu przez kilka wątków. Musiało by być 5 funkcji dla 5 wątków z tym, że współdzielą jeden obiekt (połączenie).

0

A dlaczego jedno zapytanie nie wykona się równocześnie z kilku wątków?

Czyli mam to rozumieć w ten sposób, że jeśli dam w jednym wątku Inserta a w drugim Select'a to wykona się równocześnie, ale jeśli dałbym już dwa Inserty (mogę je wywołać z różnymi parametrami) to one równocześnie się nie wykonają?

0
tomekz1991 napisał(a):

A dlaczego jedno zapytanie nie wykona się równocześnie z kilku wątków?

Czyli mam to rozumieć w ten sposób, że jeśli dam w jednym wątku Inserta a w drugim Select'a to wykona się równocześnie, ale jeśli dałbym już dwa Inserty (mogę je wywołać z różnymi parametrami) to one równocześnie się nie wykonają?

Równocześnie, czyli w tej samej nanosekundzie? Pewno nie. Za to wykonają się równolegle, bo o to chodzi w programowaniu wielowątkowym.
A jeśli chodzi Ci o operacje na jednej tabeli, to to, czy w ogóle wykonają się równolegle, zależy nie tylko od wątków, ale od samej bazy i jej konfiguracji.

Co właściwie chcesz osiągnąć? Ile i jakiego rodzaju operacji chcesz w ten sposób przyspieszyć?

0

Chodzi po prostu o to aby program uruchomił kilka wątków, które w danym momencie wykonują równocześnie swoje zapytanie na bazie.

Być może nie do końca mnie rozumiecie, z tego powodu, że na bazach danych bedziemy przerabiali tematy związane z transakcjami. Na razie w moim zadaniu chodzi o to, aby zasypać bazę danych wieloma zapytaniami na raz.

0
tomekz1991 napisał(a):

Na razie w moim zadaniu chodzi o to, aby zasypać bazę danych wieloma zapytaniami na raz.

Jeśli uruchomisz milion zapytań w czterech wątkach, to bazę zasypiesz.
Jeśli uruchomisz cztery zapytania na czterech wątkach, to baza tego nie poczuje.

0

Ok, jeśli zatem dobrze zrozumiałem to muszę stworzyć kilka wątków i w każdym z nich kilkaset zapytań.

W takim razie, czy rozsądnym będzie stworzenie odpowiednich funkcji (każda z nich będzie generowała kilkaset zapytań) a następnie wywołanie tych funkcji za pomocą wątków?

W zasadzie będzie to wyglądało bardzo podobnie do tego jak program na początku tematu, tylko że w miejsce Funkcja napiszę odpowiednio Funkcja1, ..., Funkcja5 gdzie każda z tych funkcji będzie zawierała wiele zapytań.

1 użytkowników online, w tym zalogowanych: 0, gości: 1