2016-11-23 4 views
0

In meiner Webanwendung habe ich separate Klassen DataAccess.java und DBUtils.java.So schließen Sie die MySql-Datenbankverbindung ordnungsgemäß

Ich habe folgenden Code in DBUtils.jva

public static PreparedStatement getPreparedStatement(String sql) throws ClassNotFoundException, SQLException{ 
    PreparedStatement ps = null; 
    Class.forName("com.mysql.jdbc.Driver"); 
    String url = "jdbc:mysql://localhost:3306/company"; 
    String user = "root"; 
    String pass = "root"; 

    Connection con = DriverManager.getConnection(url, user, pass); 
    ps = con.prepareStatement(sql);  

    return ps; 

I in DataAccess.java Klasse folgenden Code haben

public static List<Company> getAllCompanies(){ 
    List<Company> ls = new LinkedList<>(); 

    try { 
     String sql = "select * from company"; 
     ResultSet rs = DBUtils.getPreparedStatement(sql).executeQuery();    
     while (rs.next()){ 
      Company cp = new Company (rs.getInt(1), rs.getString(2), rs.getInt(3),rs.getTimestamp(9)); 
      ls.add(cp); 
     } 
     rs.close();    
    } catch (ClassNotFoundException | SQLException ex) { 
     Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    return ls; 
} 

Und ich bin getAllCompanies Funktion von einem anderen Servlet-Aufruf. Ich kann die Datenbankverbindung nicht richtig schließen, da sie in einer Klasse geöffnet ist und von einer anderen Klasse aufgerufen wird. Meine Webanwendung stürzt aufgrund zu vieler offener Verbindungen zur Datenbank ab. Der Fehler lautet:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Datenquelle hat Verbindungsaufbau abgelehnt, Nachricht vom Server: "Zu viele Verbindungen"

Könnte mir bitte jemand sagen, wie man die Datenbankverbindung in diesem Fall richtig schließt.

Antwort

0

Sie schließen nur die resultset

aber Sie sind die Verbindung nicht geschlossen wird.

in einem finally-Block bitte

con.close() 

diese Informationen für mehr tun beziehen: Closing Database Connections in Java

0

Grundsätzlich sind Sie die Datenbank nicht schließen connection Objekte, die die Verbindung Lecks schaffen. Sie müssen also Ihre DBUtil-Methode wie unten gezeigt zu getConnection() ändern.

immer close die Ressourcen (connection, preparedstatement und resultset Objekte) im finally Block wie unten dargestellt, sonst wird es die Verbindung Lecks erstellen und sehr bald werden Sie aus Verbindungen laufen.

DBUtil getConnection():

public static Connection getConnection() throws ClassNotFoundException, SQLException{ 
    PreparedStatement ps = null; 
    Class.forName("com.mysql.jdbc.Driver"); 
    String url = "jdbc:mysql://localhost:3306/company"; 
    String user = "root"; 
    String pass = "root"; 

    Connection con = DriverManager.getConnection(url, user, pass); 
    return con; 
} 

getAllCompanies() Code:

public static List<Company> getAllCompanies(){ 
    List<Company> ls = new LinkedList<>(); 
    PreparedStatement pstmt = null; 
    ResultSet rs = null; 
    Connection conn = null; 
    try { 
     String sql = "select * from company"; 
     conn = DBUtils.getConnection(); 
     pstmt = conn.prepareStatement(sql);  
     rs = pstmt.executeQuery();    
     while (rs.next()){ 
      Company cp = new Company (rs.getInt(1), rs.getString(2), rs.getInt(3),rs.getTimestamp(9)); 
      ls.add(cp); 
     } 

    } catch (ClassNotFoundException | SQLException ex) { 
     Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     if(rs != null) { 
      rs.close(); 
     } 
     if(pstmt !=null) { 
      pstmt.close(); 
     } 
     if(conn != null) { 
      conn.close(); 
     } 
    } 
    return ls; 
} 

Auch empfehle ich Ihnen sehr zu erstellen Methoden wie closeConnection(), closeResultSet(), closePreparedStatement() in Ihrer DBUtil Klasse in Reihenfolge um den Boilerplate-Code in allen Methoden zu vermeiden.

+0

Vielen Dank. Es macht durchaus Sinn. Was würden Sie in Methoden wie closeConnection(), closeResultSet() und closePreparedStatement() schreiben. Da es nur eine Zeile braucht, um sie zu schließen, und wenn ich diese Methoden und DBUtils erstelle, würde es eine Zeile dauern, sie trotzdem aufzurufen. Was empfehlen Sie. – Monauwar

0

Ich habe folgenden Code jetzt in DBUtils.java Klasse i Methoden haben folgende

public static void closeResultSet(ResultSet rs) throws ClassNotFoundException, SQLException { 
    if(rs != null) { 
     try { 
      rs.close(); 
     } catch (SQLException ex) { 
      Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

public static void closePreparedStatement(PreparedStatement ps) throws ClassNotFoundException, SQLException { 
    if(ps != null) { 
     try { 
      ps.close(); 
     } catch (SQLException ex) { 
      Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

public static void closeConnection(Connection conn) throws ClassNotFoundException, SQLException { 
    if(conn != null) { 
     try { 
      conn.close(); 
     } catch (SQLException ex) { 
      Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

Und in DataAccess.java Klasse I haben,

public static List<Company> getAllCompanies(){ 
    List<Company> ls = new LinkedList<>(); 
    ResultSet rs = null; 
    PreparedStatement ps = null;   
    Connection conn = null; 
    try { 
     String sql = "select * from company"; 
     conn = DBUtils.getConnection(); 
     ps = conn.prepareStatement(sql); 
     rs = ps.executeQuery(); 
     while (rs.next()){ 
      Company cp = new Company (rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getTimestamp(9)); 
      ls.add(cp); 
     } 
    } catch (ClassNotFoundException | SQLException ex) { 
     Logger.getLogger(DataAccess.class.getName()).log(Level.SEVERE, null, ex); 
    }finally { 
     DBUtils.closeResultSet(rs); 
     DBUtils.closePreparedStatement(ps); 
     DBUtils.closeConnection(conn); 
    } 

Ich habe es noch nicht erstellt, aber ich denke, Es sollte in Ordnung sein. Danke nochmal für die Hilfe.

Verwandte Themen