connection pool

Problemi z drugimi jeziki kot so c++, cgi, java, itd.
Odgovori
M.C
Prispevkov: 630
Pridružen: 24.02.2003 14:27:43

connection pool

Odgovor Napisal/-a M.C » 05.05.2009 08:28:39

uporabjam proxool

Nekako sem pričakoval da connection pool manager sam pogrunta kdaj se en klic konča in sam sprosti connection nazaj v connection pool,
v smislu : pride klic skoz en connection v poolu, in pool manager počaka da kaj pride ven iz baze , in sprosti connection nazaj v pool.

Namesto tega moram zmeraj naredit con.open, nekaj naredim in nato con.close(kar kao sprosti connection nazaj v connection pool)

Zajeb je , ker če grem potem gledat no. of conections na sql server nikol ne vem kateri so ti regularni od connection poola
(ki se bodo zaprli čez določen čas - by connection pool manager , če ne bodo v uporabi ),
in kateri so ti ki sem jih slučajno pozabil zapret s con.close, oz so obviseli ker jih nisem sprostil v kakšnem exceptionu.

A to je standard za vse connecion pool managerje da moraš peš povedat da zdaj pa določenga connectiona v poolu ne rabiš več ?
Order is heavens first rule. Therefore some must be better than the rest.

aoven
Prispevkov: 2338
Pridružen: 27.06.2001 23:56:07

connection pool

Odgovor Napisal/-a aoven » 05.05.2009 08:56:27

A to je standard za vse connecion pool managerje da moraš peš povedat da zdaj pa določenga connectiona v poolu ne rabiš več ?
Ne poznam tega proxool-a, ampak odgovor je "ne". Connection manager običajno sam ugotovi, kdaj lahko zmanjša število odprtih povezav v poolu glede na neko nastavitev (npr. max. število povezav preseženo ali pa je timeout za uporabo potekel). Da bi user koda ročno zapirala povezave, ki so pod kontrolo poola, je nonsense.

Drži pa, da mora user koda običajno sama povedat, kdaj ne rabi več povezave, da jo lahko connection manager vrne v pool in jo s tem da na voljo drugim.

Tipična koda za delo s poolom:

Koda: Izberi vse

var
  Connection: TConnection;
begin
  Connection := ConnectionPool.Acquire();
  try
    // Use the Connection
  finally
    ConnectionPool.Release(Connection);
  end;
end;
Če je connection manager dobro napisan, potem namesto TConnection vrača IConnection, s čimer ti prišpara try..finally. Ko interface pade ven iz scopa, se mu namreč samodejno zmanjša reference count, kar manager v ozadju prestreže in ga sam vrne v pool:

Koda: Izberi vse

var
  Connection: IConnection;
begin
  Connection := ConnectionPool.Acquire();

  // Use the Connection. It will be released automatically at the end of this method.
end;
ConnectionPool.Release() lahko sicer tudi v tem primeru še vedno uporabiš, če npr. želiš povedati, da je s povezavo nekaj narobe in želiš, da jo manager počisti. V takem primeru ima Release običajno še en dodaten boolean parameter, preko katerega poveš, da je povezava "dirty".

Aleksander

Odgovori