Java i pula połączeń

0

Witam!

Mam aplikację internetowa, która korzysta z puli połączeń, dokładniej servlet, który jest kontrolerem aplikacji, i klasę, która posiada wszystkie metody, które służą do obsługi bazy danych, powiedzmy nazywa się databaseUtil. I teraz, jeżeli w kontrolerze, chcąc pobrać zasób x z bazy danych, uruchamiam metodę getX z obiektu klasy databaseUtil, która zwraca ResultSet, a ten rozkładam i przekazuje do wektora z obiektami klasyX i przekazuję do widoku. Sprawa tyczy się właśnie pobieranie połączenia z puli połączeń, tzn: gdy tworzę obiekt klasy databaseUtil, w konstruktorze mam pobranie połączenia z puli, i wywołuję jakąś metodę, mniej więcej tak

public class databaseUtil
{

private dbPool dbp = null;
private Connection conn = null;
public databaseUtil()
{
this.dbp = new dbPool(); // dbPool to singleton
this.conn = dbp.getConnection();
}

getX()
{
try
{
//zapytania i wykonywanie
}
catch(Exception e)
{
//obsługa wyjątki
}
finally
{
this.dbp.freeConnection(this.con);
}
}
 

I teraz mój problem, jeżeli zwrócę połączenie do bazy, to teoretycznie zostanie ono zwrócone, ale praktycznie istnieje ono nadal, natomiast jeżeli przy zwracaniu ustawie je na null, to do wykonania w kontrolerze dwóch zapytań o zasoby, będę musiał tworzyć dwa obiekty z databaseUtil. Jest jeszcze trzecia możliwość, mogę w każdej metodzie ustanawiwać połączenie i go zwracać, ale wtedy wydaje mi się, że jest to mało optymalne... Co o tym sądzicie?

Pozdrawiam!

0

Ten dbPool wcale nie jest singletonem moim zdaniem, skoro ma publiczny konstruktor i jak tworzysz wiele obiektow databaseUtil to tworzy sie wiele dbPool.
Co do samej puli polaczen, to moze zainteresuj sie czy connector jdbc ktory uzywasz juz nie ma np implementacji javax.sql.ConnectionPoolDataSource - tworzysz taki data source, wywolujesz na nim metode getConnection(), a gdy skonczysz juz i wywolasz connection.close(), zostaje ono zwrocone do puli. Te connection co dostajesz z wczesniej wymienionej metody implementuja javax.sql.PooledConnection, i close() na nich nie zamyka polaczenia, a zwraca do puli. Nie da sie tego zrobic ze zwyklym javax.sql.Connection - close() naprawde zamyka polaczenie.
Jesli nie ma takiej implementacji w connectorze ktory uzywasz. to zawsze mozesz sie zainteresowac proxool, dbcp albo jakies inne gotowe rozwiazania. Nie ma sensu raczej pisac tego samemu, narazasz sie na bledy itp.
No chyba ze Twoim zadaniem jest napisanie wlasnie puli polaczen, ale w takim razie za malo powiedziales o dbPool i twojej implementacji. No i zrob z tego poarzadny singleton.
Pozdro.

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