Results 1 to 6 of 6

Thread: "CommandBehavior.CloseConnection" sluit die wel de conectie?

  1. #1
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415

    "CommandBehavior.CloseConnection" sluit die wel de conectie?

    IN een ASP.NET applicatie krijg ik de volgende foutmelding bij wat intensievere gebruik.
    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
    Dus kan ik wel concluderen dat hij uit de beschikbare connections loopt?

    Ik zal proberen se structuur van mijn applicatie uit te leggen.
    Ik mag gebruik van MS SQL server 2000 en de SQL datacomponenten van ASP.NET - dus niet de Borland componenten.

    De data access heb ik in aparte classes gemaakt in deze structuur:
    Code:
    type
      TReisInfoClass = class
      private
        { Private Declarations }
      public
        constructor Create;
        function HaalPictos(ReisNR: Integer): SqlDataReader;
    
    ...
    
    constructor TReisInfoClass.Create;
    begin
      inherited Create;
    end;
    
    function TReisInfoClass.HaalPictos(ReisNR: Integer): SqlDataReader;
    var
      AConnection : SqlConnection;
      ACommand :SqlCommand;
      AParameterProjectID :SqlParameter;
      ADr:SqlDataReader;
    begin
      // Creëer een instantie van Connection en Command object
      AConnection := SqlConnection.Create(ConfigurationSettings.AppSettings['ConnString']);
      ACommand := SqlCommand.Create('Pictos', AConnection);
    
      // Zet de SQL in de CommandText property
      ACommand.CommandText:=
      '/*HaalPictos*/ '+
      'SELECT Pub, Hint, PictogramSrc, '+
      '       CASE WHEN Tekst IS NULL THEN ''n'' ELSE ''j'' END AS IsLink '+
      '  FROM VakantiePubs VP INNER JOIN '+
      '       Reizen R ON VP.VakantieID = R.VakantieID INNER JOIN '+
      '       (SELECT PubID, Pub, Hint, Tekst, PictogramSrc FROM Pubs '+
      '         WHERE PictogramSrc <> '''') P ON VP.PubID = P.PubID '+
      'WHERE  ReisID = @ReisID '+
      'ORDER BY Positie ';
    
      // Creëer en zet de parameter
      AParameterProjectID := SqlParameter.Create('@ReisID', SqlDbType.Int, 4);
      AParameterProjectID.Value := TObject(ReisNR);
      ACommand.Parameters.Add(AParameterProjectID);
    
      // Voer de Command uit en maak daardoor de DataReader aan
      AConnection.Open;
      ADr := ACommand.ExecuteReader(CommandBehavior.CloseConnection);
    
      // Geef de DataReader terug
      Result:= ADr;
    end;
    
    ...
    Op mijn WebPagina (aspx) gebruik ik deze class als volgt:
    Code:
    procedure TReisInfo.DoeDataBind;
    var
     ReisInfoDB: TReisInfoClass;
    begin
     try
      ReisInfoDB:= TReisInfoClass.Create;
    
      DRReisInfo:= ReisInfoDB.HaalReisInfo(FReisNR);
    
      with DLPubs do begin
       DataSource:= ReisInfoDB.HaalPubs(FReisNR);
       DataKeyField:= 'PubID';
       DataBind;
      end; //with
    
    ....
    
     except
      on E:Exception do begin
       //Trace voor het debuggen, in definitieve versie uit gezet
       Trace.Warn('Foutje Reis Pagina ',E. Message);
       Raise;
      end;
     end; //except
    end;
    Dus ik maak een variabel SQLDataReader aan en gebruik die later met "while SQLDataReader.Read do..." of ik koppel de teruggegeven SQLDataReader aan de DataSource van DataList, DataGrid, etc.

    Volgens wat ik heb begrepen zou het aanroepen/maken van de SQLDataReader met de parameter "ExecuteReader(CommandBehavior.CloseConnection )" dat de conectie gesloten wordt op moment de SQLDataReader klaar is?

    De vraag is nu waarom wordt de connecties blijkbaar niet terug gegven aan de pool?

    Ik denk zelf aan drie zaken.
    1. In de Data access class doe dus geen direct Close van de connection. Maar dat zou volgens mij ook tot het probleem leiden dat de SQLDataReader nog niet alles heeft gelezen voordat de connection is gesloten?

    2. Had ik de connection moeten Free'en in de Data access class, dat zou volgens mij tot dezelfde probleem leiden als onder 1.

    3. Moet ik de instantie van de Data access class vrij geven met free in mijn WebForm?

    Heeft iemand iets dergelijks ondervonden?
    Anders

    May your code compile!

  2. #2
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    CommandBehavior.CloseConnection sluit de Connection als je de DataReader sluit. Dat laatste zie ik je nergens doen.
    All methodologies are based on fear. -- Kent Beck.

  3. #3
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    Hartstikke bedankt Dirk

    Ga meteen inbouwen - Maar nog een vraag

    Bij deze gaat dat naatuurlijk makelijk, als ik klaar ben met de DataReader kan ik hem sluiten.
    Code:
    DRPics:= ReisInfoDB.HaalPictos(FReisNR);
    Maar bij deze dan:
    Code:
    with DLPubs do begin
     DataSource:= ReisInfoDB.HaalPubs(FReisNR);
     DataKeyField:= 'PubID';
     DataBind;
    end; //with
    
    Moet ik dan eerst een variabel vullen zoals boven en die dan sluiten of sluit de DataList in dit geval (of een DataGrid) de DataReader?
    Anders

    May your code compile!

  4. #4
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Doe de DataReader.Close na de DataBind (of in de DataBind).
    Je zou ook wat exception handling moeten voorzien, zodat, als er iets misgaat, je de connectie toch sluit (niet zo eenvoudig in je huidige opzet).
    Ik gebruik een DataReader nooit op die manier: meestal krijgt de WebPage gewoon een container (Arraylist, Array, Collection, ...) van objecten (al dan niet opgevuld door een DataReader). In zowat alle andere gevallen gebruik ik een DataSet.
    All methodologies are based on fear. -- Kent Beck.

  5. #5
    Senior Member Anders's Avatar
    Join Date
    Dec 2001
    Location
    Doetinchem
    Posts
    1,415
    De close DataReader heb ik wel in een Try / finally en met daar in een Try/Except om eventuele exception's af tevangen. Die laat ik dan Raise'n en in de Global.asax in de Application_Error event afhandelen.

    Dat je de DataReader anders gebruikt - moet ik dat dan zien zo dat je in je BL een ArrayList, Array, etc. met een Datareader vult en daar dus ook meteen de conectieon sluit?
    Anders

    May your code compile!

  6. #6
    SillyMember
    Join Date
    May 2003
    Location
    Gent
    Posts
    7,725
    Ja, inderdaad.
    All methodologies are based on fear. -- Kent Beck.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Similar Threads

  1. testen applicatie
    By Q-Ligunom in forum Koffiehoek
    Replies: 31
    Last Post: 22-Jan-05, 20:52
  2. Replies: 67
    Last Post: 15-Jun-04, 12:32
  3. MySQL, localhost en webtoepassing
    By Jan in forum WebDelphi
    Replies: 26
    Last Post: 01-Sep-03, 19:40
  4. beveiligen TButton of TBitBtn?
    By gajes in forum Algemeen
    Replies: 22
    Last Post: 21-May-01, 00:00

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •