C# - App neuzatvára pripojenie k DB

Programovacie jazyky, rady, poradňa...
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

C# - App neuzatvára pripojenie k DB

Príspevok od používateľa pitbullko »

Ahojte,
robím App ktorá používa DB (MS SQL Server 2008 R2). Na prístup k DB používam vlastnú triedu, ktorá dedí od triedy DataContext.
Jednu inštanciu tohto objektu používa celá App. Problémom je, že databázové pripojenie je stále otvorené.
Odvtedy, ako prvýkrát pristúpim k DB až pokiaľ nieje App ukončená. To, že je spojenie aktívne vidím cez Microsoft SQL Server Management Studio na databáze, ktorú táto App využíva - obr. v prílohe.

Nerozumiem tomu, nakoľko DataContext by mal otvárať a uzavierať pripojenie automaticky pri každom dotaze na DB. Ani použitie using neuzavrie spojenie.

Kód: Vybrať všetko

    
    public class InfoKalDatabase : DataContext
    {
        public Table<User> Users;
        public Table<Permission> Permissions;
        public Table<Customer> Customers;
        public Table<Container> Containers;

        private static InfoKalDatabase _instance;

        public InfoKalDatabase(String connectionString)
            : base(connectionString)
        {
        }

        public static InfoKalDatabase Instance
        {
            get
            {
                if (_instance == null)
                {
                    SqlConnectionStringBuilder conf = new SqlConnectionStringBuilder();
                    conf.DataSource = "server";
                    conf.InitialCatalog = "database";
                    conf.UserID = "user";
                    conf.Password = "pass";
                    _instance = new InfoKalDatabase(conf.ConnectionString);
                }
                return _instance;
            }
        }
    }


    using (InfoKalDatabase db = InfoKalDatabase.Instance)
    {
        .....
    }
Vedel by mi niekto prosím vysvetliť, prečo sa spojenie po dotaze na DB neuzavrie ale až po skončení App? Prípadne nejaké rady, ako ho uzavrieť.
Dík
Prílohy
conn.png
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa harrison314 »

Takyto problem som este neriesil, ale skus zrusit _instance , Instance a vytvorenie SqlConnectionStringBuilder presun bud do konstruktora alebo do nejakej staticej metody.
Mne tam vadi ten singlton.
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa pitbullko »

Skúsil som si spraviť úplne jednoduchú app bez toho singltonu, no stále píše od prvého prístupu k DB až po ukončenie app 1 Active connection.
Netuším, čím to je.
Server nieje localhost, je na inom PC no v jednej Windowsovej doméne. Je možné, že SQL server sám nejak interne udržiava spojenie s app? Aj keď by to bolo veľmi divné ak by takto plytval...
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa axxis »

Toto je len taka strela do prazdna, tak to neber moc vazne, ale nemusis implementovat to zatvorenie rucne v destruktore? (override Dispose())
ropman
Medium Professional
Medium Professional
Príspevky: 1250
Registrovaný: 12 apr 2010, 21:07

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa ropman »

myslis ze je dobre otvarat/zatvarat spojenia pre kazde query ? ak ti nestaci 1 spojenie tak si najdi nejaku kniznicu na connection pooling alebo mozno .net daco take ma.
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa axxis »

Ad ten co si mysli, ze Dispose() nie je destruktor:
V jazyce C# jsou také destruktory podporovány, pracují však odlišným způsobem, ze kterého vyplývá, že jejich užití není tak časté jako například v C++. V C# je automatická správa paměti, která v určitých, předem neurčených, okamžicích pročistí paměť tak, že odstraní objekty, na které již neexistuje žádná reference. Odtud vyplývá, že okamžik odstranění objektu nastává s určitým zpožděním po ukončení platnosti všech referencí na daný objekt, tj. po okamžiku, kdy už není objekt potřeba a zabírá pouze místo v paměti. Pokud objekt drží prostředky, které by měly bý uvolněny co nejdříve po ukončení jeho platnosti, není nutné čekat na automatickou správu paměti. K tomu slouží dvoustupňové paradigma destrukce:

Taková třída musí implementovat rozhraní System.IDisposable. Toto rozhraní má pouze deklaraci jediné funkce IDisposable.Dispose(). Tato metoda pak může být klientem objektu volána v okamžiku, kdy se daný objekt stane nepotřebný a může být odstraněn.

V této třídě je možné definovat také destruktor, který použije k odstranění objektu automatická správa paměti (garbagge collector). Destruktor slouží jako záložní mechanismus pro případ, že některý z klientů objektu nezavolá metodu Dispose().
Ano, je sice pravda, ze to nie je klasicky destruktor ako z C-cka, ale too fucking bad. (je to prva polovica destruktoru, resp. cely objektovy a este som sa cely svoj zivot nevidel, ze by to doslo az skutocne na nicenie referencie, to snad len v nejakom unsafe alebo co) Asi kazdy na svete oznacuje metodu, ktora sa stara o nejake uzatvaranie na ukci klauzuly using (resp. vo finally) ako desktruktor, ale budiz, snad to ma aj nejake ine viac vyhovujuce meno.
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa manager666 »

pitbullko:
Staci nastavit vlastnost Pooling u triedy SqlConnectionStringBuilder na false. Defaultne je nastavena na true.
:wink:
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa harrison314 »

pitbullko napísal:Skúsil som si spraviť úplne jednoduchú app bez toho singltonu, no stále píše od prvého prístupu k DB až po ukončenie app 1 Active connection.
Netuším, čím to je.
Server nieje localhost, je na inom PC no v jednej Windowsovej doméne. Je možné, že SQL server sám nejak interne udržiava spojenie s app? Aj keď by to bolo veľmi divné ak by takto plytval...
Podla mna to neni plytvanie, vytvaranie spojenia a autentifikacia je narcnejsie ako udrzovanie spojenia, ale samozrejme je vhodne toto spojenie ukoncit co nasjkor.
pitbullko
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 294
Registrovaný: 13 nov 2009, 8:19
Bydlisko: „Keby som bol postavený pred rozhodnutie medzi zbabelosťou a násilím, zvolil by som násilie“[Gandhi]

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa pitbullko »

Dík chlapi za rady.
to manager666
máš pravdu, je to v nastavení SqlConnectionStringBuilder.Pooling Property. Vďaka

Čo vlastne potom spôsobí použitie using v tomto prípade? Vyzerá, že nič.
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: C# - App neuzatvára pripojenie k DB

Príspevok od používateľa axxis »

pitbullko napísal:Dík chlapi za rady.
to manager666
máš pravdu, je to v nastavení SqlConnectionStringBuilder.Pooling Property. Vďaka

Čo vlastne potom spôsobí použitie using v tomto prípade? Vyzerá, že nič.
using je len jedna z formuli C#, ktora bola vymyslena pre rychlejsie programovanie. Sama o sebe vlastne nic neznamena, ale pri compilacii sa prelozi na bloky try, catch a finally kde vo finally sa vola metoda dispose.
Napísať odpoveď