Avatar billede magic-mouse Novice
14. juni 2011 - 12:31 Der er 12 kommentarer og
2 løsninger

Singleton til MySQL connection.

Hej, jeg tænker på at lave en singleton class som kan administere mine SQL connections, for at sikre at hvis der er en forbindelse åben at den bliver genbrugt.

Jeg finder dog ikke nogen god guide, så hvis der er nogen som har et kode eksempel eller link til en guide, ville det være hjælpsomt.

Alternativt et godt argument til hvorfor man ikke skal gøre sådan samt en alternativ løsning.
Avatar billede softspot Forsker
14. juni 2011 - 12:41 #1
Er connection pooling ikke understøttet pr. default for MySQL? Det mener jeg den er for SQL Server. Men det afhænger måske af hvilken driver man benytter...(?)
Avatar billede softspot Forsker
14. juni 2011 - 12:43 #2
Avatar billede magic-mouse Novice
14. juni 2011 - 13:26 #3
Hej ... jo det var pointen i sidste ende. Men det jeg vil med den her er application->klassebibliotek ikke server->mysql server som connection pooling er.

Jeg tænkte nu mere noget sådan her:
Applikation/Website -> Singleton -> Connection -> MySqlServer.

årsagen er at jeg vil fjerne gentaget kode ved at lave en function som kalder databasen med div. connection, functionen ser ud som flg.

KaldDatabase(string sql, int type)
Avatar billede softspot Forsker
14. juni 2011 - 13:42 #4
Kunne du evt. bruge en factoryklasse (evt. konfigurerbar via web.config), som sørgede for at aflevere en connection til den givne database... eller misforstår jeg hvad du vil...?
Avatar billede arne_v Ekspert
14. juni 2011 - 14:28 #5
En connection pool er en singleton.

Er der nogen pointe i at du vil skrive en singleton til det fremfor at bruge MySQL's?

Det er:

din app----MS connection pool----DB

versus:

din app----din connection pool----DB
Avatar billede magic-mouse Novice
14. juni 2011 - 14:54 #6
Hej Arne


ja pointen er at når jeg skal udføre et databaser kald kan jeg enten skrive


try
        {


            string hostnavn = Vars.getMySqlHost();
            string Brugernavn = Vars.getMySqlUsername();
            string Adgangskode = Vars.getMySqlPassword();
            string Database = Vars.getMySqlDatabase();
            string Administration = "http://mysql6.unoeuro.com";


            string mysql = "Server=" + hostnavn + ";Database=" + Database + ";Uid=" + Brugernavn + ";Pwd=" + Adgangskode + "";
            con.ConnectionString = mysql;
            con.Open();


            cmd = con.CreateCommand();
            cmd.Connection = con;
        }
        catch (Exception err)
        {
            this.Close();
            throw new Exception(err.Message);
        }

MySqlDataReader reader;
        try
        {

            cmd.CommandText = sql;
            reader = null;

            if (type == 1)
            {
                reader = cmd.ExecuteReader();
            }
            else if (type == 2)
            {
                int i = cmd.ExecuteNonQuery();
            }
           
        }
        catch (Exception err)
        {
            this.Close();
            throw new Exception(err.Message);
        }
       
this.Close();

        return reader;


eller

KaldDatabase(string sql, int type)

Den ene mulighed er 1 linie den anden er 80, så for at jeg ikke gentagende gange skal skrive 80 linier laver jeg en funktion så jeg kun skal skrive den en gang.
Avatar billede Syska Mester
14. juni 2011 - 15:06 #7
Jamen, så skal du jo bare gøre overstående generisk, så du netop kan kalde det som:
KaldDatabase("sql", 10)

Den metode indeholder så overstående 80 linjer ...

Er det ikke hvad du er efter ?

mvh
Avatar billede arne_v Ekspert
14. juni 2011 - 15:16 #8
Det giver god mening at putte noget gentaget kode et centralt sted og genbruge det.

Men det har ikke noget med singleton og holde connection (connection pool) at goere.

Du kan godt genbruge kode og bruge den indbyggede connection pool.

Koden ovenfor minder ioevrigt en del om DAAB - masske skulle du kigge paa det.
Avatar billede magic-mouse Novice
14. juni 2011 - 15:20 #9
Jo men der er så 2 problemer med ovenstående kode.

1. Den lukker ikke database adgangen ordentligt (kan ikke finde fejlen)
2. funktionen returnere null.


Dog ser jeg nu at jeg har overset en vigtig detalje (eller nærmere læst forkert) - Der står jo faktisk at jeg IKKE skal gøre som jeg har gjort i ovenstående eksempel.

Jeg kigger lige nærmere på dette når jeg har lidt mere tid så jeg ikke overser vigtige detaljer som den der.
Avatar billede softspot Forsker
14. juni 2011 - 15:21 #10
Altså erklær en metode på en klasse som ser nogenlunde således ud (for nu at tage udgangspunkt i din egen kode):

public MySqlDataReader KaldDatabase(string sql, int type)
{
    try
    {
        string hostnavn = Vars.getMySqlHost();
        string Brugernavn = Vars.getMySqlUsername();
        string Adgangskode = Vars.getMySqlPassword();
        string Database = Vars.getMySqlDatabase();
        string Administration = "http://mysql6.unoeuro.com";

        string mysql = "Server=" + hostnavn + ";Database=" + Database + ";Uid=" + Brugernavn + ";Pwd=" + Adgangskode + "";
        con.ConnectionString = mysql;
        con.Open();

        cmd = con.CreateCommand();
        cmd.Connection = con;
    }
    catch (Exception err)
    {
        this.Close();
        throw new Exception(err.Message);
    }

    MySqlDataReader reader;
    try
    {
        cmd.CommandText = sql;
        reader = null;
        if (type == 1)
        {
            reader = cmd.ExecuteReader();
        }
        else if (type == 2)
        {
            int i = cmd.ExecuteNonQuery();
        }
         
    }
    catch (Exception err)
    {
        this.Close();
        throw new Exception(err.Message);
    }
       
    this.Close();

    return reader;
}

Dog synes jeg ikke det er optimalt at pakke det ind på denne måde, da du mister noget information fra ExecuteNonQuery. Funktionen bør mindst splittes op i to, så du har en funktion der returnerer en reader og en der returnerer en int (og måske en mere som returnerer værdien fra en ExecuteScalar). Men så skal du til at splitte din funktion yderligere op, da du så ender med at gentage en del kode flere gange ;-)
Avatar billede magic-mouse Novice
08. juli 2011 - 08:15 #12
Softspot og arne smider i et svar? Da det er jer som har givet bedst svar på spørgsmålet.
Avatar billede softspot Forsker
08. juli 2011 - 10:13 #13
:-)
Avatar billede arne_v Ekspert
08. juli 2011 - 15:22 #14
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester