Хостинг серверов Minecraft playvds.com
  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем reZero, 11 фев 2019.

  1. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Юзаю mysql и hikkaripool..
    Когда много раз перезаливаю плуг и прописываю rl в консоли, выбивает ошибку, в которой написано что слишком много подключений.. Еще выкидывакт из phpmyadmin и не пускает, пока не выключу серв полностью.. Как пофиксить? В каждом методе, где юзаю mysql в конце закрывпю подключение..
     
  2. Mr Hosting
  3. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Имя в Minecraft:
    Dymeth
    Видимо плохо закрываешь.
    Показывай код вместе с параметрами работы
     
    Последнее редактирование: 11 фев 2019
  4. hyndorik

    hyndorik Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    А релоад вообще не надо юзать, там костыли жестб, смысол
     
  5. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ибо надо закрывать конект в onDisable.
     
  6. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    1. НИКОГДА не пользуйся /reload
    2. Если всё же он требуется, сделай в своём плагине такую команду.
    3. Решить проблему "Too many connections" поможет уменьшение времени ожидания wait_timeout в my.cnf (по умолчанию оно составляет аж 8 часов)
     
  7. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    PHP:
    public static HikariDataSource hikari;
        private 
    boolean initialized false;

         public 
    SQL(RDBMS rdbmsString usernameString passwordString hostint portString databaseString poolNameint maxConnections) {
                
    initializeConnPool(rdbmsusernamepasswordhostportdatabasepoolNamemaxConnections); // Initialize pool
            
    }

            public 
    SQL(DatabaseTemplate templateString poolNameint maxConnections) {
                
    this(template.rdbmstemplate.usernametemplate.passwordtemplate.hosttemplate.porttemplate.databasepoolNamemaxConnections);
            }

            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 rdbmsString usernameString passwordString hostint portString databaseString poolNameint 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.MYSQLusername2password2host2port2db2);

                
    RDBMS rdbms;
                
    String usernamepasswordhostdatabase;
                
    int port;

                
    DatabaseTemplate(RDBMS rdbmsString usernameString passwordString hostint portString 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(1signName);
                
    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(1signName);
                
    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 playerNameLocalDateTime 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(1playerName);
                
    ps.setString(2String.valueOf(date));
                
    ps.setString(3String.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(1playerName);
                
    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. понимаю, что код, мягко говоря, говно, но я очень надеюсь, что Вы подскажите где можно его подправить)
     
  8. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Код у тебя запутанный. Работа с пулом осуществляется примерно так. Нужно каждый раз брать новый Connecton когда тебе нужно выполнить запрос.
    Код:
    import com.zaxxer.hikari.HikariConfig;
    import com.zaxxer.hikari.HikariDataSource;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    class Database {
    
       private HikariDataSource source;
    
       public Database() {
           // Init
           HikariConfig conf = new HikariConfig();
           conf.setJdbcUrl("jdbc:mysql://localhost:3306/minecraft?characterEncoding=utf8"); // TODO: Это хорошо бы одной целой строкой в конфиг вынести, чтобы гибкость настройки была максимальной
           conf.setUsername("username");
           conf.setPassword("hackme");
           conf.addDataSourceProperty("connectionTimeout", 30000);
           conf.addDataSourceProperty("idleTimeout", 60000);
           conf.addDataSourceProperty("maxLifetime", 90000);
           conf.addDataSourceProperty("maximumPoolSize", 4);
           source = new HikariDataSource(conf);
       }
    
       public Connection getSqlConnection() throws SQLException {
           return source.getConnection();
       }
    
       /**
        * Это пример выполнения SQL запроса
        */
       public boolean checkExists(String signName) {
           // Здесь используется AutoCloseable. Объекты автоматически закроются после выхода из блока try
           // При использовании пула соединений, нужно каждый раз вызывать getConnection(), а потом его закрывать - чтобы соединение снова стало "свободным" для использования
           try (Connection con = this.getSqlConnection(); PreparedStatement ps = con.prepareStatement("SELECT * FROM SignStorage WHERE signName = ?")) {
               ps.setString(1, signName);
               ResultSet rs = ps.executeQuery();
               if(rs.next()) return true;
           } catch (SQLException e) {
               e.printStackTrace();
           }
           return false;
       }
    
       /**
        * Завершить работу пула (из onDisable() вызывать)
        */
       public void shutdown() {
           source.close();
           source = null;
       }
    
    }
     
  9. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    У него там и так лимит порвался, а ты ему еще подкинул пул коннектов. Красавчик.
     

Поделиться этой страницей