Archief - Java: Too many connections

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Dieterg

Legacy Member
We moeten voor school een website maken waar je spelletjes kan uitlenen. Nu dacht ik eens een functie toe te voegen om een volgend en vorig spel makkelijk op te halen. Dit werkt allemaal goed en wel enkel krijg ik soms volgende error. (dit is trouwens random, niet altijd bij hetzelfde spel ofzo).

Code:
type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
root cause

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.0.1 logs.

Nu heb ik al wat zitten googlen naar deze error, ik word er alleen niet wijzer van..

Zo roep ik het volgende of het vorige spel op:
PHP:
<p>
                            <a href="ManageServlet?spelNrVorige=<%=detailsSpel.getNr() -1 %>">&larr; Vorig zoekertje</a> |
                            <a href="ManageServlet?spelNrVolgende=<%=detailsSpel.getNr() + 1 %>">Volgend zoekertje &rarr;</a>
 </p>

Hier verwerk ik het:
PHP:
if (spelNrVorige != null) {
            //details pagina
            int spelNr = Integer.parseInt(spelNrVorige);

            int maxNummer = daspel.getMaxNummer();

            if (spelNr == 0) {
                spelNr = maxNummer;
            }

            Spel spel = daspel.getSpel(spelNr);
            Aard aard = daaard.getAard(spel.getAardnr());
            Moeilijkheid moeilijkheid = damoeilijkheid.getMoeilijkheid(spel.getMoeilijkheidsNr());

            request.setAttribute("detailsAard", aard);
            request.setAttribute("detailsMoeilijkheid", moeilijkheid);
            request.setAttribute("detailsSpel", spel);

            rd = request.getRequestDispatcher("overzicht.jsp");
        } else if (spelNrVolgende != null) {
            //details pagina
            int spelNr = Integer.parseInt(spelNrVolgende);

            int maxNummer = daspel.getMaxNummer();

            if (spelNr == maxNummer) {
                spelNr = 0;
            }

            Spel spel = daspel.getSpel(spelNr);
            Aard aard = daaard.getAard(spel.getAardnr());
            Moeilijkheid moeilijkheid = damoeilijkheid.getMoeilijkheid(spel.getMoeilijkheidsNr());

            request.setAttribute("detailsAard", aard);
            request.setAttribute("detailsMoeilijkheid", moeilijkheid);
            request.setAttribute("detailsSpel", spel);

            rd = request.getRequestDispatcher("overzicht.jsp");
        }

Ik denk dat het probleem zich voordoet bij het 'maxnummer'.. Dit is de methode om maxnummer op te halen:
PHP:
public int getMaxNummer() {
        int nummer = 0;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select nr from spel order by nr desc");

            if(resultSet.first()){
                nummer = resultSet.getInt(1);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
            }
        }

        return nummer;
    }

Is er iemand hier zo vriendelijk om dit eens te bekijken? Alvast bedankt! Indien u meer code nodig hebt zal ik het hier posten!

Gr mam

edit: ik heb net eens een "JOptionPane.showMessageDialog(null, "statement closed");" in de finally block toegevoegd. Dat blijkt toch normaal te werken? Grrr, ik denk dat het probleem dus niet echt bij mijn code zit? Eerder bij een of andere instelling? Ookal heb ik niets moeten instellen over connecties ofzo?

Cycloon

Legacy Member
Je opent waarschijnlijk telkens nieuwe connecties zonder deze te sluiten. Maar er is te weinig code om dat met zekerheid te kunnen zeggen.

Dieterg

Legacy Member
Cycloon ik ben elke methode afgegaan om dit te controleren, alle klassen die ik heb zal ik hier eens pasten:
PHP:
public class DAAard {

    private Connection connection = null;

    public DAAard(String url, String login, String password, String driver) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        connection = DriverManager.getConnection(url, login, password);
    }

    public void close() throws SQLException {
        if (connection != null) {
            connection.close();
        }
    }

    public ArrayList<Aard> getAlleAard() {
        ArrayList<Aard> resultaat = new ArrayList<Aard>();
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select * from aard");

            //resultaat opvullen d.m.v. de resultaten in de resultset
            while (resultSet.next()) {
                Aard aard = new Aard();
                aard.setNr(resultSet.getInt(1));
                aard.setBeschrijving(resultSet.getString(2));
                resultaat.add(aard);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return resultaat;
    }

    public Aard getAard(int nr) {
        Aard aard = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            //prepared statement om sql injection te voorkomen
            statement = connection.prepareStatement("SELECT * FROM aard WHERE nr = ?");
            statement.setInt(1, nr);
            resultSet = statement.executeQuery();
            if (resultSet.first()) {
                aard = new Aard();
                aard.setNr(resultSet.getInt(1));
                aard.setBeschrijving(resultSet.getString(2));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return aard;
    }

    public Aard getAardNummer(String beschrijving) {
        Aard aard = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            //prepared statement om sql injection te voorkomen
            statement = connection.prepareStatement("SELECT * FROM aard WHERE beschrijving = ?");
            statement.setString(1, beschrijving);
            resultSet = statement.executeQuery();
            if (resultSet.first()) {
                aard = new Aard();
                aard.setNr(resultSet.getInt(1));
                aard.setBeschrijving(resultSet.getString(2));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return aard;
    }
}

public class DALogin {

    private Connection connection = null;

    public DALogin(String url, String login, String password, String driver) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        connection = DriverManager.getConnection(url, login, password);
    }

    public void close() throws SQLException {
        if (connection != null) {
            connection.close();
        }
    }

    public ArrayList<Login> getAlleLogin() {
        ArrayList<Login> resultaat = new ArrayList<Login>();
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select * from login");

            //resultaat opvullen d.m.v. de resultaten in de resultset
            while (resultSet.next()) {
                Login login = new Login();
                login.setNr(resultSet.getInt(1));
                login.setNaam(resultSet.getString(2));
                login.setPasswoord(resultSet.getString(3));
                login.setAutoriteitNiveau(resultSet.getString(4));
                login.setLenernr(resultSet.getInt(5));
                resultaat.add(login);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return resultaat;
    }

    public Login getLogin(int nr) {
        Login login = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            //prepared statement om sql injection te voorkomen
            statement = connection.prepareStatement("SELECT * FROM login WHERE nr = ?");
            statement.setInt(1, nr);
            resultSet = statement.executeQuery();
            if (resultSet.first()) {
                login = new Login();
                login.setNr(resultSet.getInt(1));
                login.setNaam(resultSet.getString(2));
                login.setPasswoord(resultSet.getString(3));
                login.setAutoriteitNiveau(resultSet.getString(4));
                login.setLenernr(resultSet.getInt(5));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return login;
    }
}
package be.khk.lesson.dataaccess;

import java.util.*;
import java.sql.*;
import be.khk.lesson.beans.*;

public class DAMoeilijkheid {

    private Connection connection = null;

    public DAMoeilijkheid(String url, String login, String password, String driver) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        connection = DriverManager.getConnection(url, login, password);
    }

    public void close() throws SQLException {
        if (connection != null) {
            connection.close();
        }
    }

    public ArrayList<Moeilijkheid> getAlleMoeilijkheid() {
        ArrayList<Moeilijkheid> resultaat = new ArrayList<Moeilijkheid>();
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select * from moeilijkheid");

            //resultaat opvullen d.m.v. de resultaten in de resultset
            while (resultSet.next()) {
                Moeilijkheid moeilijkheid = new Moeilijkheid();
                moeilijkheid.setNr(resultSet.getInt(1));
                moeilijkheid.setBeschrijving(resultSet.getString(2));
                resultaat.add(moeilijkheid);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return resultaat;
    }

    public Moeilijkheid getMoeilijkheid(int nr) {
        Moeilijkheid moeilijkheid = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            //prepared statement om sql injection te voorkomen
            statement = connection.prepareStatement("SELECT * FROM moeilijkheid WHERE nr = ?");
            statement.setInt(1, nr);
            resultSet = statement.executeQuery();
            if (resultSet.first()) {
                moeilijkheid = new Moeilijkheid();
                moeilijkheid.setNr(resultSet.getInt(1));
                moeilijkheid.setBeschrijving(resultSet.getString(2));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return moeilijkheid;
    }
}

public class DASpel {

    private Connection connection = null;

    public DASpel(String url, String login, String password, String driver) throws ClassNotFoundException, SQLException {
        Class.forName(driver);
        connection = DriverManager.getConnection(url, login, password);
    }

    public void close() throws SQLException {
        if (connection != null) {
            connection.close();
        }
    }

    public ArrayList<Spel> getAlleSpel() {
        ArrayList<Spel> resultaat = new ArrayList<Spel>();
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select * from spel");

            //resultaat opvullen d.m.v. de resultaten in de resultset
            while (resultSet.next()) {
                Spel spel = new Spel();
                spel.setNr(resultSet.getInt(1));
                spel.setNaam(resultSet.getString(2));
                spel.setUitgever(resultSet.getString(3));
                spel.setAuteur(resultSet.getString(4));
                spel.setJaarUitgifte(resultSet.getInt(5));
                spel.setLeeftijd(resultSet.getString(6));
                spel.setMinSpelers(resultSet.getInt(7));
                spel.setMaxSpelers(resultSet.getInt(8));
                spel.setAardnr(resultSet.getInt(9));
                spel.setSpeelDuur(resultSet.getString(10));
                spel.setMoeilijkheidsNr(resultSet.getInt(11));
                spel.setPrijs(resultSet.getDouble(12));
                spel.setAfbeelding(resultSet.getString(13));
                resultaat.add(spel);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return resultaat;
    }

    public Spel getSpel(int nr) {
        Spel spel = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            //prepared statement om sql injection te voorkomen
            statement = connection.prepareStatement("SELECT * FROM spel WHERE nr = ?");
            statement.setInt(1, nr);
            resultSet = statement.executeQuery();
            if (resultSet.first()) {
                spel = new Spel();
                spel.setNr(resultSet.getInt(1));
                spel.setNaam(resultSet.getString(2));
                spel.setUitgever(resultSet.getString(3));
                spel.setAuteur(resultSet.getString(4));
                spel.setJaarUitgifte(resultSet.getInt(5));
                spel.setLeeftijd(resultSet.getString(6));
                spel.setMinSpelers(resultSet.getInt(7));
                spel.setMaxSpelers(resultSet.getInt(8));
                spel.setAardnr(resultSet.getInt(9));
                spel.setSpeelDuur(resultSet.getString(10));
                spel.setMoeilijkheidsNr(resultSet.getInt(11));
                spel.setPrijs(resultSet.getDouble(12));
                spel.setAfbeelding(resultSet.getString(13));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return spel;
    }

    //zoekresultaten
    public ArrayList<Spel> getSpelZoeken(String naam, double prijs, String auteur, String uitgever, int aard) {
        ArrayList<Spel> resultaat = new ArrayList<Spel>();
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            if (naam.equals("") == false && auteur.equals("") == false && uitgever.equals("") == false && prijs != -1 && aard != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and spel.uitgever like ? and spel.auteur like ? and spel.prijs <= ? and spel.aardnr.nr = ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "1");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, '%' + uitgever + '%');
                statement.setString(3, '%' + auteur + '%');
                statement.setDouble(4, prijs);
                statement.setInt(5, aard);

                //selecteren als prijs niet is ingevuld..
            } else if (aard != -1 && naam.equals("") == false && auteur.equals("") == false && uitgever.equals("") == false) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and spel.auteur like ? and spel.uitgever like ? and spel.aardnr = ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "2");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, '%' + auteur + '%');
                statement.setString(3, '%' + uitgever + '%');
                statement.setInt(4, aard);

                //selecteren als uitgever niet is ingevuld
            } else if (aard != -1 && naam.equals("") == false && auteur.equals("") == false && prijs != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and spel.auteur like ? and spel.prijs <= ? and aard.beschrijving like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "3");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, '%' + auteur + '%');
                statement.setDouble(3, prijs);
                statement.setInt(4, aard);

                //selecteren als auteur niet is ingevuld
            } else if (aard != -1 && naam.equals("") == false && auteur.equals("") == false && prijs != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and spel.uitgever like ? and spel.prijs <= ? and aard.beschrijving like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "4");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, '%' + uitgever + '%');
                statement.setDouble(3, prijs);
                statement.setInt(4, aard);

                //selecteren als aard niet is ingevuld
            } else if (auteur.equals("") == false && naam.equals("") == false && auteur.equals("") == false && prijs != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and spel.uitgever like ? and spel.prijs <= ? and spel.auteur like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "5");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, '%' + uitgever + '%');
                statement.setDouble(3, prijs);
                statement.setString(4, '%' + auteur + '%');

                //selecteren als enkel naam en uitgever is ingevuld
            } else if (naam.equals("") == false && uitgever.equals("") == false) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and spel.uitgever like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "6");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, '%' + uitgever + '%');

                //selecteren als enkel auteur en uitgever is ingevuld
            } else if (auteur.equals("") == false && uitgever.equals("") == false) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.auteur like ? and spel.uitgever like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "7");
                statement.setString(1, '%' + auteur + '%');
                statement.setString(2, '%' + uitgever + '%');

                //selecteren als prijs en auteur is ingevuld
            } else if (auteur.equals("") == false && prijs != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.auteur like ? and spel.prijs <= ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "8");
                statement.setString(1, '%' + auteur + '%');
                statement.setDouble(2, prijs);

                //selecteren als prijs en aard is ingevuld
            } else if (aard != -1 && prijs != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where aard.beschrijving like ? and spel.prijs <= ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "9");
                statement.setInt(1, aard);
                statement.setDouble(2, prijs);

                //selecteren als naam en aard is ingevuld
            } else if (aard != -1 && naam.equals("") == false) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where aard.beschrijving like ? and spel.naam like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "10");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, naam);

                //selecteren als naam en aard is ingevuld
            } else if (aard != -1 && auteur.equals("") == false) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where aard.beschrijving like ? and spel.auteur like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "11");
                statement.setString(1, '%' + naam + '%');
                statement.setString(2, auteur);

                //selecteren als prijs en naam is ingevuld
            } else if (auteur.equals("") == false && prijs != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and spel.prijs <= ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "12");
                statement.setString(1, '%' + naam + '%');
                statement.setDouble(2, prijs);

                //enkel aard
            } else if (aard != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.aardnr = ? and aard.nr = spel.aardnr");
                //JOptionPane.showMessageDialog(null, "13");
                statement.setInt(1, aard);
                //enkel auteur
            } else if (auteur.equals("") == false) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.auteur like ? and spel.aardnr = aard.nr");
                //JOptionPane.showMessageDialog(null, "14");
                statement.setString(1, '%' + auteur + '%');

                //enkel uitgever
            } else if (!uitgever.equals("")) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.uitgever like ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "15");
                statement.setString(1, '%' + uitgever + '%');

                //enkel naam
            } else if (!naam.equals("")) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.naam like ? and aard.nr = spel.nr");
                // JOptionPane.showMessageDialog(null, "16");
                statement.setString(1, '%' + naam + '%');

                //enkel prijs
            } else if (prijs != -1) {
                statement = connection.prepareStatement("select spel.nr, spel.naam, spel.uitgever, spel.auteur, spel.jaar_Uitgifte, spel.leeftijd, spel.min_Spelers, spel.max_Spelers, spel.aardnr, spel.speelduur, spel.moeilijkheidNr, spel.prijs, spel.afbeelding from spel, aard where spel.prijs <= ? and aard.nr = spel.nr");
                //JOptionPane.showMessageDialog(null, "17");
                statement.setDouble(1, prijs);

                //niets
            } else {
                //JOptionPane.showMessageDialog(null, "18");
                statement = connection.prepareStatement("select * from spel");
            }

            resultSet = statement.executeQuery();

            //resultaat opvullen d.m.v. de resultaten in de resultset
            while (resultSet.next()) {
                Spel spel = new Spel();
                spel.setNr(resultSet.getInt(1));
                spel.setNaam(resultSet.getString(2));
                spel.setUitgever(resultSet.getString(3));
                spel.setAuteur(resultSet.getString(4));
                spel.setJaarUitgifte(resultSet.getInt(5));
                spel.setLeeftijd(resultSet.getString(6));
                spel.setMinSpelers(resultSet.getInt(7));
                spel.setMaxSpelers(resultSet.getInt(8));
                spel.setAardnr(resultSet.getInt(9));
                spel.setSpeelDuur(resultSet.getString(10));
                spel.setMoeilijkheidsNr(resultSet.getInt(11));
                spel.setPrijs(resultSet.getDouble(12));
                spel.setAfbeelding(resultSet.getString(13));
                resultaat.add(spel);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
            } catch (SQLException e) {
            }
        }

        //return
        return resultaat;
    }

    public int getMaxNummer() {
        int nummer = 0;
        Statement statement = null;
        ResultSet resultSet = null;

        try {
            statement = connection.createStatement();
            resultSet = statement.executeQuery("select nr from spel order by nr desc");

            if(resultSet.first()){
                nummer = resultSet.getInt(1);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
            } catch (SQLException e) {
            }
        }

        return nummer;
    }
}
Zoals je kan zien sluit ik elke methode af met een finally om de connecties te sluiten..

edit: kan je misschien ergens zien hoeveel connections er open staan? Zodat ik dat eens in een messagebox kan printen ofzo?

NeverwinterX

Legacy Member
Je maakt bij elke nieuwe DAAard, DALogin etc een nieuwe connectie. Een database ondersteunt maar een bepaald aantal connecties tegelijk. Ofwel moet je meer connecties expliciet sluiten, ofwel meer connecties toelaten op de database ofwel connectie pooling toepassen.

Dieterg

Legacy Member
NeverwinterX zei:
Je maakt bij elke nieuwe DAAard, DALogin etc een nieuwe connectie. Een database ondersteunt maar een bepaald aantal connecties tegelijk. Ofwel moet je meer connecties expliciet sluiten, ofwel meer connecties toelaten op de database ofwel connectie pooling toepassen.

Maar dit probleem komt pas voor na bv. 30x op volgend zoekertje te duwen. De connectie wordt toch telkens terug gesloten? Dus als hij de eerste keer toelaat om 5x tegelijkertijd te connecten zou hij dat na de 30ste keer toch ook moeten doen? Hij gaat dus bv 30 langs manageservlet en dan inneens geeft hem die error. Soms is het ook al sneller, soms duurt het wat langer..

Wolf2000me

Legacy Member
We hebben jouw domein code niet, en ik vind ook je entry point niet terug. In elk geval close je de statement en resultset correct, maar volgens mij max je je connecties uit wanneer je 100 van je "DA..." classes hebt geïnstantieerd. Deze classes beschikken wel degelijk over een "close()" methode maar het is natuurlijk al direct mogelijk dat je ergens in je code in een aantal van zulke objecten vergeet je close() methode aan te roepen op het juiste moment.
Daarboven kan het ook zijn dat de situatie zich voordoet waarbij je 100 DA objecten hebt in de heap die effectief ook niet hun connectie hoeven te sluiten en je dus van "nature" uit je connecties uit maxt.

Ik noem hier 100 omdat dit de default is van MySQL. Het kan nu ook wel 150 zijn, afhangend van je versie. AFAIK is 150 eigenlijk de default bij de nieuwere versies van MySQL.

Je kan gebruik maken van de MySQL Monitor, daar in de prompt:
"show processlist;"
vragen.

Dieterg

Legacy Member
@wolf, dat is precies een beetje chinees voor mij :-).. Ik roep idd nerges zelf een close() methode op.

Nu heb ik volgende code is toegevoegd in me DASpel
PHP:
public void close() throws SQLException {
        if (connection != null) {
            connection.close();
            JOptionPane.showMessageDialog(null,"daspelClose");
        }
    }

Als ik dan men project sluit komt er zo inneens na 5min. die messagebox.. Is dat normaal? Of zou het normaal al veel sneller uit zen eigen moeten sluiten? Kan ik deze methode zelf aanroepen zodat ik het handmatig sluit?

Dieterg

Legacy Member
Bedankt allemaal, ik het het probleem ondertussen kunnen oplossen door Destory() aan te roepen voor dat ik de requestdispatcher forward :-)!

kimdenkt

Legacy Member
Voor de duidelijkheid : de reden waarom je vroeger pas na een tijd problemen had (of pas na een tijd die message box zag), was omdat je connecties toen pas gesloten werden nadat je objecten door de garbage collector opgekuist werden (waardoor de connecties mee dicht gingen). Dit kan je dus verhelpen door zelf je connecties te sluiten.

Maar de manier waarop je je database access doet is toch niet ideaal hoor, nu gaat het misschien nog, maar in een groter project ga je echt wel in de problemen komen, indien niet door bugs dan toch tenminste door onoverzichtelijkheid.
Het is beter om je "business objects" en je database access strict gescheiden te houden.
Volgende uitleg is wellicht complexer dan je voorlopig nodig hebt, maar je kan er alvast de standaard terminologie vinden om meer informatie te kunnen zoeken (en vragen stellen mag natuurlijk ook altijd :)
Core J2EE Patterns - Data Access Object

Dieterg

Legacy Member
Bedankt voor de link kim, ik ga het zeker eens bekijken! Het spijtige is dat we van onze docent op bovenstaande manier moeten werken. Dus dat zal iets voor in mijn vrije tijd zijn!

kimdenkt

Legacy Member
Afhankelijk van hoe strikt de regels van je docent zijn, kan je misschien de code iets mooier maken zonder al te ingrijpende veranderingen. Zulke verbeteringen zijn natuurlijk niet noodzakelijk de moeite in een klein project dat je achteraf niet meer onderhoudt, maar als je voldoende tijd en goesting hebt is het natuurlijk wel handig om de juiste gewoontes te oefenen.

Je kan bvb al je data access klasses laten afleiden van een basis data access klasse, je database properties (url, login, ...) static maken in die basis klasse, en een protected method getConnection toevoegen die telkens een nieuwe connectie aanmaakt met die properties. En dan in al je data access methodes telkens via die methode een connectie aanmaken, en die in je finally block op het einde terug sluiten. Je kan eventueel ook een close methode toevoegen die een resultset, statement, en connectie meekrijgt, en die alle 3 sluit (voor zover ze niet null zijn), in een try-catch block natuurlijk.
Op die manier spaar je wat duplicate code uit, en beperk je de tijd dat je connecties open zijn tot het minimum.

Het is meestal ook niet zo'n goed idee om exceptions zomaar te catchen en dan enkel maar te loggen, behalve als er effectief geen probleem is. Maar een SQLException die optreedt als je data probeert op te halen is meestal wel een probleem. Aangezien je die fout niet kan herstellen, en wellicht toch verderop een NullPointerException zou krijgen, is het wellicht best om ook een nieuwe RuntimeException (of eigen specifieke afgeleide klasse) te throwen (met natuurlijk die SQLException als parameter). Op die manier krijg je betere stacktraces (zeker relevant als je op termijn je error-afhandeling wat zou gaan centraliseren).

Het gebruik van scriptlets in JSPs wordt over het algemeen ook afgeraden. In je voorbeeld gebruik je het enkel om een variabele te tonen, wat natuurlijk niet zo erg is, maar sommige mensen komen snel in de verleiding om al te veel logica in zo'n scriptlets te steken, wat de onderhoudbaarheid niet ten goede komt.
Als alternatief wordt meestal JSTL aangeraden, dat beperktere mogelijkheden heeft, maar wel voldoende voor de dingen die geen kwaad kunnen. Bovendien krijg je (met de meeste gangbare tools) betere error-checking, code completion, ...

En bovenal, have fun, dat is nog altijd het belangerijkste :)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan