2017-06-25 1 views
-2

lassen Sie uns annehmen, dass ich eine JSP-Seite habe, die während des Ladens muss zuerst Kategorien dann Produkte laden und ich habe eine Datenbank Verbindungsklasse mit listCategories und getProducts Funktionen meine Frage ist über sollte ich verbinden und schließen DB-Verbindung während in jeder Funktion aufgerufen oder eine Verbindung über der jsp Seite db und schließen, wenn Seite geladen Beispielcode:Best Practice für Datenbank-Verbindung und Schließen

public class DbConnection { 

    private Connection conn = null; 
    private PreparedStatement ps = null; 
    private ResultSet rs = null; 

    private void connect() { 

     try { 
      DriverManager.registerDriver(new Driver()); 
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/shop", "", ""); 
     } catch (SQLException ex) { 
      Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    private void close() { 
     try { 
      if (!conn.isClosed()) { 
       conn.close(); 
      } 
     } catch (SQLException ex) { 
      Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public List<Category> listCategories() { 

     connect(); 
     List<Category> listCategory = new ArrayList<>(); 
     try { 
      ps = conn.prepareStatement("select * from Category where sub_category=0"); 
      rs = ps.executeQuery(); 
      while (rs.next()) { 
       Category u = new Category(rs.getInt("id"), rs.getString("name"), rs.getInt("sub_category")); 
       listCategory.add(u); 
      } 
      return listCategory; 
     } catch (SQLException ex) { 
      Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
     }finally{ 
      close(); 
     } 
     return null; 
    } 

    public List<Products> getProducts() { 

     connect(); 
     List<Products> listProducts = new ArrayList<>(); 
     try { 
      ps = conn.prepareStatement("select * from products"); 
      rs = ps.executeQuery(); 
      while (rs.next()) { 
       Products p = new Products(rs.getInt("id"), rs.getString("name")); 
       listCategory.add(p); 
      } 
      return listCategory; 
     } catch (SQLException ex) { 
      Logger.getLogger(DbConnection.class.getName()).log(Level.SEVERE, null, ex); 
     }finally{ 
      close(); 
     } 
     return null; 
    } 
} 

und Beispiel jsp Code:

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 

    </head> 

    <%for(Category c: dc.listCategories()){%> 
    <h1><%=c.getName()%></h1> 
    <%}%> 

    <%for(Products p: dc.getProducts()){%> 
    <h1><%=p.getName()%></h1> 
    <%}%> 
    <body> 
     <h1>Hello World!</h1> 
    </body> 
</html> 
+2

Best Practice ist nie Scriptlets zu verwenden und ein Framework wie Spring MVC zu verwenden, das die Belange von Logik und Präsentation trennt. – chrylis

+0

Ich stimme diese Frage als off-topic zu schließen, weil es nicht konstruktiv ist. – EJoshuaS

+0

Sie sollten einen Verbindungspool verwenden, um Verbindungen wie DBCP2 zu verwalten – 11thdimension

Antwort

0

Am besten wäre es eine öffnen Verbindung einmal, vor Beginnen Sie mit dem Rendern einer Seite, fragen Sie nach allen benötigten Modelldaten, schließen Sie dann die Verbindung und starten Sie das Rendern.

Auf diese Weise:

  • Sie eine Verbindung herstellen wird nur einmal
  • Sie werden durch die Bereitstellung der Vorlage einer Business-Beschwerde Vorlage Logik von Datenbank/Business-Logik noch mehr entkoppeln, bereit Modell zu machen
  • Sie sind nicht anfällig für Fehler beim Rendern der Vorlage (was bedeutet, dass Sie keine Verbindung während der Behandlung einer solchen Situation schließen müssen)
  • Sie können im Falle eines Datenbankfehlers leicht unterschiedliche Vorlage anzeigen (weil Vorlage wird sta rt Rendern