Помогите Mysql беда с кол-вом подключений

  • Автор темы Автор темы reZero
  • Дата начала Дата начала

reZero

Активный участник
Пользователь
Баллы
76
Юзаю mysql и hikkaripool..
Когда много раз перезаливаю плуг и прописываю rl в консоли, выбивает ошибку, в которой написано что слишком много подключений.. Еще выкидывакт из phpmyadmin и не пускает, пока не выключу серв полностью.. Как пофиксить? В каждом методе, где юзаю mysql в конце закрывпю подключение..
 
Видимо плохо закрываешь.
Показывай код вместе с параметрами работы
 
Последнее редактирование:
А релоад вообще не надо юзать, там костыли жестб, смысол
 
PHP:
public static HikariDataSource hikari;
    private boolean initialized = false;

     public SQL(RDBMS rdbms, String username, String password, String host, int port, String database, String poolName, int maxConnections) {
            initializeConnPool(rdbms, username, password, host, port, database, poolName, maxConnections); // Initialize pool
        }

        public SQL(DatabaseTemplate template, String poolName, int maxConnections) {
            this(template.rdbms, template.username, template.password, template.host, template.port, template.database, poolName, maxConnections);
        }

        public Connection getIdleConnection() {
            try {
                return hikari.getConnection();
            } catch (SQLException e) {
                e.printStackTrace();
                return null;
            }
        }

        public void killPool() {
            try {
                hikari.unwrap(HikariDataSource.class).close();
                hikari.close();
            } catch (SQLException e) {
                System.err.println(" ____________________________________");
                System.err.println("|                                    |");
                System.err.println("| The database pool failed to close! |");
                System.err.println("|____________________________________|");
            }
        }

        private void initializeConnPool(RDBMS rdbms, String username, String password, String host, int port, String database, String poolName, int maxConnections) {
            if (initialized) return;

            HikariConfig conf = new HikariConfig();
            conf.setDriverClassName(rdbms.driver);
            conf.setJdbcUrl("jdbc:" + rdbms.name().toLowerCase() + "://" + host + ":" + port + "/" + database);
            conf.setUsername(username);
            conf.setPassword(password);
            conf.addDataSourceProperty("connectionTimeout", 30000);
            conf.addDataSourceProperty("idleTimeout", 60000);
            conf.addDataSourceProperty("maxLifetime", 90000);
            conf.addDataSourceProperty("minimumIdle", Math.round(maxConnections / 4));
            conf.addDataSourceProperty("maximumPoolSize", maxConnections);
            if (!poolName.isEmpty()) conf.addDataSourceProperty("poolName", poolName);
            hikari = new HikariDataSource(conf);
            initialized = true;
        }
      
        static String username2 = Main.getInstance().getConfig().getString("MySQL.username");
        static String password2 = Main.getInstance().getConfig().getString("MySQL.password");
        static  String host2 = Main.getInstance().getConfig().getString("MySQL.host");
        static  int port2 = Main.getInstance().getConfig().getInt("MySQL.port");
        static String db2 = Main.getInstance().getConfig().getString("MySQL.database");
      

        public enum DatabaseTemplate {
            PROD(RDBMS.MYSQL, username2, password2, host2, port2, db2);

            RDBMS rdbms;
            String username, password, host, database;
            int port;

            DatabaseTemplate(RDBMS rdbms, String username, String password, String host, int port, String database) {
                this.rdbms = rdbms;
                this.username = username;
                this.password = password;
                this.host = host;
                this.port = port;
                this.database = database;
            }
        }

        public enum RDBMS {
            MYSQL("com.mysql.jdbc.Driver"), POSTGRESQL("org.postgresql.Driver");

            String driver;

            RDBMS(String driver) {
                this.driver = driver;
            }
        }

PHP:
private static SQL sql;
public void onEnable()
{
    Main.sql = new SQL(SQL.DatabaseTemplate.PROD, "Region", 10);

}

public SQL getSql()
{
     return sql;
}

public Connection getSqlConnection()
{
    return getSql().getIdleConnection();
}

PHP:
    public boolean existsByName(String signName)
    {
        Connection con = null;
        PreparedStatement ps = null;
        try
        {
            con = Main.getInstance().getSqlConnection();
            ps = con.prepareStatement("SELECT * FROM SignStorage WHERE signName = ?");
            ps.setString(1, signName);
            ResultSet rs = ps.executeQuery();
            if(rs.next())
            {
                return true;
            }
            Main.getInstance().getSqlConnection().close();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(con != null)
            {
                try
                {
                    con.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
            if(ps != null)
            {
                try
                {
                    ps.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return false;
}

    public void destroySign(String signName)
    {
        Connection con = null;
        PreparedStatement ps = null;
        try
        {
            con = Main.getInstance().getSqlConnection();
            ps = con.prepareStatement("DELETE FROM SignStorage WHERE signName = ?");
            ps.setString(1, signName);
            ps.executeUpdate();
            Main.getInstance().getSqlConnection().close();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(con != null)
            {
                try
                {
                    con.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
            if(ps != null)
            {
                try
                {
                    ps.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
}


    public void setLastPayment(String playerName, LocalDateTime date)
    {
        Connection con = null;
        PreparedStatement ps = null;
        try
        {
            con = Main.getInstance().getSqlConnection();
            ps = con.prepareStatement("INSERT INTO PaymentsInfo (playerName, LastRent) VALUES (?,?) ON DUPLICATE KEY UPDATE LastRent=?");
            ps.setString(1, playerName);
            ps.setString(2, String.valueOf(date));
            ps.setString(3, String.valueOf(date));
            ps.executeUpdate();
            Main.getInstance().getSqlConnection().close();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(con != null)
            {
                try
                {
                    con.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
            if(ps != null)
            {
                try
                {
                    ps.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    public LocalDateTime getLastPayment(String playerName)
    {
        Connection con = null;
        PreparedStatement ps = null;
        LocalDateTime date = null;
        try
        {
            con = Main.getInstance().getSqlConnection();
            ps = con.prepareStatement("SELECT * FROM PaymentsInfo WHERE playerName = ?");
            ps.setString(1, playerName);
            ResultSet rs = ps.executeQuery();
            rs.next();
            String str = String.valueOf(LocalDateTime.parse(rs.getString("LastRent")));
            date = LocalDateTime.parse(str);
            Main.getInstance().getSqlConnection().close();
        }
        catch(SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(con != null)
            {
                try
                {
                    con.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
            if(ps != null)
            {
                try
                {
                    ps.close();
                } catch (SQLException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return date;
    }

P.S. понимаю, что код, мягко говоря, говно, но я очень надеюсь, что Вы подскажите где можно его подправить)
 
У него там и так лимит порвался, а ты ему еще подкинул пул коннектов. Красавчик.
 
Назад
Верх