Dobry den,

ten ukazkovy kod vypada teda dost brutalne.

Mne se osvedcilo pouziti vnorenych try-finally bloku.
Myslim, ze je to prehlednejsi a elegantnejsi.

Priklad:

void myMethod() throws SQLexception {
    Connection con = ds.getConnection();
    try {
        Statement st = con.createStatement();
        try {
            ResultSet rs = st.executeQuery();   
            try {
                ... // zpracovani dat z 'rs'    
            } finally {
                rs.close();
            }
        } finally {
            st.close();
        }
    } finally {
        con.close();
    }
}

Vyse uvedeny kod predpoklada, ze objekt (con, st, rs) je bud vytvoren
uspesne anebo je vyhozena vyjimka (tj. nenastane situace, ze napr. metoda
ds.getConnection() sice skonci bez vyjimky, avsak vrati <null>).
To by u JDBC melo platit.

Osetreni vyhozene vyjimky (SQLException) muzete resit bud v metode volajici 
anebo cele telo metody myMethod obalit jeste jednim blokem (try-catch).

Pokud takovych metod budete mit vice, budou se v podstate lisit jenom kodem
v tom nejvnitrnejsim bloku. Opakujici se kod by se asi dal dale eliminovat.
("template method" pattern, "command" pattern).

mp.


-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Tomáš Procházka
Sent: Sunday, February 19, 2006 1:08 PM
To: [email protected]
Subject: DataConnection pooling in Tomcat

Zdravím.

Na stránce:
http://tomcat.apache.org/tomcat-5.0-doc/jndi-datasource-examples-howto.html
je ukázka doporučeného kódu pro práci s Connection v kontejneru Tomcatu a musím 
říct, že je to poměrně složitý postup (viz konec příspěvku).

Chtěl bych použít něco, co to zjednoduší, přemýšlel jsem o Jakrta Commons - 
DBUtils, jenže je tam jedna věc, které se bojím.

V té doporučené ukázce zavírají Connection na konco výkonného bloku a pak ještě 
ve finally bloku. 

Jaký je rozdíl mezi:

try {
  conn.close()
} finnaly {
  conn.close()
}

a

try {
  
} finnaly {
  conn.close()
}

Tedy když se vynechá to uzavření ve výkonné části? Nebude pak docházet k 
vyčerpání zdrojů?
DBUtills veškeré uzavírání provádí právě až ve finnaly bloku.

Nebo existuje nějaké lepší řešení než DBUtils? Mě se tohle líbí právě pro svou 
jednoduchost, nepotřebuji na to 10 MB knihoven.


Ukázka doporučeného použiti Connection v Tomcat kontejner:

 Connection conn = null;
  Statement stmt = null;  // Or PreparedStatement if needed
  ResultSet rs = null;
  try {
    conn = ... get connection from connection pool ...
    stmt = conn.createStatement("select ...");
    rs = stmt.executeQuery();
    ... iterate through the result set ...
    rs.close();
    rs = null;
    stmt.close();
    stmt = null;
    conn.close(); // Return to connection pool
    conn = null;  // Make sure we don't close it twice
  } catch (SQLException e) {
    ... deal with errors ...
  } finally {
    // Always make sure result sets and statements are closed,
    // and the connection is returned to the pool
    if (rs != null) {
      try { rs.close(); } catch (SQLException e) { ; }
      rs = null;
    }
    if (stmt != null) {
      try { stmt.close(); } catch (SQLException e) { ; }
      stmt = null;
    }
    if (conn != null) {
      try { conn.close(); } catch (SQLException e) { ; }
      conn = null;
    }
  }

   

   
Datum: 12:59:44    19. února 2006
--
---------------------------------------------------------------------
 Tomáš Procházka


 E-mail: [EMAIL PROTECTED]
    WWW: http://atom.sf.cz
    ICQ: 87147320
---------------------------------------------------------------------

Odpovedet emailem