Too many connections

 
 
 
Сообщения:6
Как поступить, есть кнопка , по ее нажатию формируется таблица с данными из БД(это все выводит), но если нажать ее несколько раз выскакивает ошибка
om.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"

Я как понял дело все в том что не закрывается соединение с БД, но я как ни пробывал его закрывать все равно ошибка.
Мой класс соединения с БД
public final class Connect {
    Connection con = null;


    public  Connection connection() {
        if(con == null){
        try {
            String url = "jdbc:mysql://localhost:3306/dbSchool2";
            String user = "root";
            String password = "root";

            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(url, user, password);
            System.out.println("con open");
            return con;
        } catch (ClassNotFoundException | SQLException e) {
            System.err.print(e);
        }
        }
        return  null;

А вот сам обработчик кнопки
    public void OnAply(ActionEvent actionEvent) {
// connection = con.connection();

        String selectedMonth = cbMonth.getSelectionModel().getSelectedItem();
        String selectedLesson = cbLesson.getSelectionModel().getSelectedItem();
        String selectedLetter = cbLetter.getSelectionModel().getSelectedItem();
        Integer selectedNumber = cbNumber.getSelectionModel().getSelectedItem();
        String selectedFIO = cbFIO.getSelectionModel().getSelectedItem();
        String[] selectedFamily_Name = selectedFIO.trim().split("\\s+");




        ObservableList<Perfomance> dataPefromance = FXCollections.observableArrayList();

        load_peromance.createPerfomanceTable(31);
        load_peromance.getMonthColumn().setText(selectedMonth);
        load_peromance.getLessonColumn().setText(selectedLesson);
        int k =1;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Statement stmt2 = null;
        try {
             stmt2 = connection.createStatement();
            rs = stmt2.executeQuery(Request.UA_RUS);
            ps = connection.prepareStatement(Request.PERFOMANCE_REQUERY);
            ps.setString(1,selectedMonth);
            ps.setString(2,selectedLesson);
            ps.setString(3,selectedFamily_Name[0]);
            ps.setString(4,selectedLetter);
            ps.setInt(5,selectedNumber);
            rs = ps.executeQuery();
            while (rs.next()){
                dataPefromance.add(new Perfomance(k++,rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),
                        rs.getString(5),rs.getString(6),rs.getString(7),rs.getString(8),rs.getString(9),rs.getString(10),
                        rs.getString(11),rs.getString(12),rs.getString(13),rs.getString(14),rs.getString(15),rs.getString(16),
                        rs.getString(17),rs.getString(18),rs.getString(19),rs.getString(20),rs.getString(21),rs.getString(22),
                        rs.getString(23),rs.getString(24),rs.getString(25),rs.getString(26),rs.getString(27),rs.getString(28),
                        rs.getString(29),rs.getString(30),rs.getString(31),rs.getString(32)));
            }
            load_peromance.getPerfomanceTableView().setItems(dataPefromance);
        } catch (SQLException e1) {
            e1.printStackTrace();
        }

        finally {
            if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                    System.out.println("PreparedStatment close");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (ps != null) {
                try {
                    ps.close();
                    System.out.println("ResultSet close");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

А это код при запуске программы
public void initialize(URL location, ResourceBundle resources) {




        try {
            con = new Connect();
            connection = con.connection();
            stmt = connection.createStatement();

        } catch (SQLException e) {
            e.printStackTrace();
        }
        //Установка соединения
        // Connection connect = con.connection();

        load_peromance = new Load_Peromance(tab_1_AnctorPane);


        //Создание списков
        listLetter = FXCollections.observableArrayList();
        listNumber = FXCollections.observableArrayList();
        listFioTeacher = FXCollections.observableArrayList();
        monthList = FXCollections.observableArrayList();
        monthList.addAll("Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь");

        listLesson = FXCollections.observableArrayList();


        ResultSet rs = null;
        try {
            rs = stmt.executeQuery(Request.LETER_CLASS_NOT_REPETITION);
            //Добавление в список данных
            while (rs.next()) {
                listLetter.add(rs.getString("leter_class"));
            }
            rs = stmt.executeQuery(Request.NUMBER_CLASS_NOT_REPETITION);
            while (rs.next()) {
                listNumber.add(rs.getInt("number_class"));
            }
            rs = stmt.executeQuery(Request.ALL_TEACHER);
            while (rs.next()) {
                listFioTeacher.add(rs.getString("family") + " " + rs.getString("name"));
            }
            rs = stmt.executeQuery(Request.ALL_LESSON);
            while (rs.next()) {
                listLesson.add(rs.getString("title"));
            }
            //Установление данных в визуальные объекты
            cbLetter.setItems(listLetter);
            cbNumber.setItems(listNumber);
            cbFIO.setItems(listFioTeacher);
            cbMonth.setItems(monthList);
            cbLesson.setItems(listLesson);

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                    System.out.println("ResultSet close");
                } catch (SQLException e) {
                    e.printStackTrace();
                }
                if (stmt != null) {
                    try {
                        stmt.close();
                        System.out.println("Statment close");
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
//                if(connection!=null){
//                    try {
//                        connection.close();
//                        connection = null;
//                        System.out.println("connection close");
//                    } catch (SQLException e) {
//                        e.printStackTrace();
//                    }
//                }

            }
        }
    }
 
 
Сообщения:89
сделать пулл коннкекшенов - брать из него свободные коннекшены и возвращать использованые, чтобы не пересоздавать их постоянно - один раз создал и поместил в пулл..
и всю работу с базой вынести в отдельный поток..
 
 
Сообщения:9474
Вот явно говорится что это происходит когда слишком много одновременных соединений открыто. Предполагая что на кнопку не нажать 100 раз за короткий промежуток времени, думаю что где-то бага и соединения создаются в каком-то цикле. Т.к. этот код очень сложно читать, остановлюсь на этом :)

keekkenen:
сделать пулл коннкекшенов - брать из него свободные коннекшены и возвращать использованые, чтобы не пересоздавать их постоянно - один раз создал и поместил в пулл..
и всю работу с базой вынести в отдельный поток..
DB Pool не поможет пофиксить багу. И выносить работу с БД в отдельный поток - это какое-то очень уж не стандартное решение..
 
 
Сообщения:89
на стороне базы есть какое-то разумное ограничение коннекшенов, и если их не контролировать (и не закрывать) в программе, то так и будет.. запустил программу, использовал 10 коннекшенов, не закрыл их, закрыл программу.. снова повторил тоже самое.. в итоге, было скажем в базе настроено максимум 20 коннекшенов, и через некоторое время они просто исчерпаются и тогда придется лезть в базу и обнулять коннекшены.. а про отдельный поток это так - нечего кнопку этим тормозить
 
 
Сообщения:6
Я для столбца определяю код
fourColumn = new TableColumn<Perfomance,String>("4");
        fourColumn.setCellValueFactory(new PropertyValueFactory<Perfomance,String>("four"));
        fourColumn.setEditable(true);
        fourColumn.setCellFactory(new Callback<TableColumn<Perfomance, String>, TableCell<Perfomance, String>>() {
            @Override
            public TableCell<Perfomance, String> call(TableColumn<Perfomance, String> param) {
                return new Cell_STR();
            }
        });

а соединения увеличиваются, магия
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет