[Servlet JDBC] Czy pisać w każdym servlecie

0

Witam!
Mam kolejne pytanie, przy pisaniu servletu łącze się z bazą danych przez takie coś:

public final class YourClass extends HttpServlet {

Connection con = null;

public void init() throws ServletException {

  String url = getServletContext().getInitParameter("url");
  String uid = getServletContext().getInitParameter("uid");
  String pwd = getServletContext().getInitParameter("pwd");

  try {
    //Register the JDBC driver
    Class.forName("oracle.jdbc.driver.OracleDriver");
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch

  //Get a connection to the database
  try {
    con = DriverManager.getConnection(url, uid, pwd);
  } catch( Exception e ) {
    e.printStackTrace();
  }//end catch

}//end init()

public void destroy() {
  try {
    //Close the connection to the database
    con.close();
  } catch( Exception e ) {
    e.printStackTrace();
  }
}

public void doGet(HttpServletRequest req,
                  HttpServletResponse res)
throws ServletException, IOException{

  try {
       [...]
       Statement st = con.createStatement();
       [ more JDBC code ]
  }
  catch (SQLException e) {
	[ ... ]
  }
}

Pytanie czy to jest dobre rozwiązanie? Bo kod w każdym servlecie trzeba powtarzać nie można w jakiś sposób zaimplementować połączenie bez powtarzania kodu?? Może jest jakiś schemat postępowania?

Dzięki z góry za pomoc!

0

To jest prawie najgorszy sposob. Gorzej byloby tylko jakbys pisal kod w stronce JSP ;-P
Schemat jest - przeczytaj o DAO (Data Access Object) pattern.

0

A jak nie DAO to sciagnij jakas implementacje puli polaczen, np c3po. Wzglednie tworz DataSource z namiarami na baze, zapisz go np w ServletContext, i z niego pobieraj na rzadanie polaczenia i zamykaj. Jednak to tez jest dosc slabe.

0

W dao można zaimplementować odpowiednie metody które będą zapisywać bądź odczytywać itp. ale mi chodzi bardziej o połączenie, no bo przecież parametry do połączenia trzymam w parametrach kontekstu, czyli tak czy inaczej musze pobrać te parametry w serwlecie, stworzyć połączenie i je zamknąć (ma być to proste rozwiązanie a wiec raczej pule odpadają, bo nie chce komplikować), no to pytanie może jak zaimplementować...

A wiec stworzyłem sobie takie ConnectionFactory które ma parametry połączenia (inicjalizowane przy starcie aplikacji) i w momencie połączenia wywołuje metodę
ConnectionFactory.getConnection();
i pozyskuje połączenie, podobnie z zamykaniem, w dao będę implementował same funkcjonalności które ma wykonywać na bazie danych, noi w każdej metodzie będę korzystał z ConnectionFactory. Oczywiście pod względem wydajności to leży bo nie ma żadnej puli gotowych połączeń, no ale pomijając te pule to takie rozwiązanie jest dobre??

0

Na domorosly sposob na malutki projekcik jest ok, ale zainteresuj sie jakims connection poolem, jest pelno opersourcowych.

0

A teraz wytłumacz mi dlaczego nie można używać jednego połączenia w wielu sesjach? Connection Pool działa właśnie w ten sposób. Pozwala na współdzielenie połączenia z bazą danych. Nawiązanie połączenia jest operacją czasochłonną i nie opłaca się utrzymywać osobnego połączenia dla każdego z użytkowników. Zresztą przy większej liczbie userów RDBMS zwróci błąd za dużej liczby połączeń.

0

Pytasz mnie czy autora? Pytasz o sesje nastepujace po sobie, czy o sesje rownolegle? Jesli rownolegle, to connection nie jest w zamysle obiektem ktory sie wspoldzieli miedzy watkami. Jesli nastepujace po sobie, to wlasnie napisalem zeby uzyl poola polaczen, a nie tworzyl nowego polaczenia raz za razem. Poola mozna skonfigurowac (min, max, itp) aby uniknal bledy zbyt wielu otwartych polaczen. Naprawde nie wiem o co Ci chodzi.

0

Autora pytam

0

Hmm a czy pule nie działają w ten sposób, że mamy pulę połączeń gotowych do użycia, i każdy użytkownik by wykonać operacje na bazie pobiera połączenie, wykonuje działa i zwraca połączenie do puli (może nie dosłownie ale połączenie jest odzyskiwane..) , ale każdy użytkownik ma inne połączenie, bo tak jak "::" zauważył co wtedy z synchronizacją między różnymi wątkami...

0

Tak wlasnie dzialaja. Przy czym jak wszystkie polaczenia sa w tej chwili zajete, to zgodnie z konfiguracja puli moze ona zostac zwiekszona, albo nowe pobieranie puli bedzie czekac az sie jakies polaczenie zwolni. Przy cyzm jak uzywasz puli, to nie twoja sprawa w kodzie co sie dzieje, ciebie interesuje konfiguracja.

0

Dzięki :: i Koziołek za pomoc!

pozdrawiam:)

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