2016-11-02 2 views
1

Я кодирую плагин статистики, который при соединении, извлекает статистику из базы данных, реализует их в хэш-карте, и после этого он реализует эти новые данные в базе данных, Причина этого заключается в том, что каждую секунду происходит не так много задержек, как открытие соединений.Получение нескольких ошибок в моей консоли из моего кода

Если это что-то значит, я использую MariaDB.

HashMaps Ниже

public static HashMap<String, Integer> kills = new HashMap<String, Integer>(); 
public static HashMap<String, Integer> deaths = new HashMap<String, Integer>(); 

Код ниже

@EventHandler 
public void onDeath(PlayerDeathEvent event){ 
    Player p = event.getEntity(); 
    Player k = p.getKiller(); 
    kills.put(k.getName(), kills.get(k.getName() + 1)); 
    deaths.put(p.getName(), deaths.get(p.getName() + 1)); 
    removeScoreboard(p); 
    setScoreboard(p); 
    removeScoreboard(k); 
    setScoreboard(k); 
} 

@EventHandler 
public void onJoin(PlayerJoinEvent e){ 
    OfflinePlayer p2 = e.getPlayer(); 
    Player p = e.getPlayer(); 
    openConnection(); 
    try{ 
     int previousDeaths = 0; 
     int previousKills = 0; 

     if(playerDataContainsPlayer(p)){ 
      PreparedStatement sql = connection.prepareStatement("SELECT deaths FROM `player_data` WHERE player=?;"); 
      PreparedStatement sql2 = connection.prepareStatement("SELECT kills FROM `player_data` WHERE player=?;"); 

      ResultSet result = sql.executeQuery(); 
      ResultSet result2 = sql2.executeQuery(); 
      result2.next(); 
      result.next(); 

      previousDeaths = result.getInt("deaths"); 
      previousKills = result2.getInt("kills"); 

      kills.put(p.getName(), previousKills); 
      deaths.put(p.getName(), previousDeaths); 

      sql.close(); 
      sql2.close(); 
      result.close(); 
      result2.close(); 
      removeScoreboard(p); 
      setScoreboard(p); 
     } else { 
      PreparedStatement newPlayer = connection.prepareStatement("INSERT INTO `player_data` values(?,0,0);"); 
      newPlayer.setString(1, p.getUniqueId().toString()); 
      newPlayer.setInt(2, 0); 
      newPlayer.setInt(3, 0); 
      newPlayer.execute(); 
      newPlayer.close(); 
      kills.put(p.getName(), 0); 
      deaths.put(p.getName(), 0); 
      removeScoreboard(p); 
      setScoreboard(p); 
     } 

    }catch(Exception e1){ 
     e1.printStackTrace(); 
    } finally{ 
     closeConnection(); 
    } 
} 

@EventHandler 
public void onLeave(PlayerQuitEvent e){ 
    Player p = e.getPlayer(); 
    openConnection(); 
    try{ 
     int previousDeaths = 0; 
     int previousKills = 0; 

     if(playerDataContainsPlayer(p)){ 
      PreparedStatement sql = connection.prepareStatement("SELECT deaths FROM `player_data` WHERE player=?;"); 
      PreparedStatement sql2 = connection.prepareStatement("SELECT kills FROM `player_data` WHERE player=?;"); 
      sql.setString(1, p.getUniqueId().toString()); 
      sql2.setString(1, p.getUniqueId().toString()); 

      ResultSet result = sql.executeQuery(); 
      ResultSet result2 = sql2.executeQuery(); 
      result2.next(); 
      result.next(); 

      previousDeaths = result.getInt("deaths"); 
      previousKills = result2.getInt("kills"); 

      PreparedStatement killsUpdate = connection.prepareStatement("UPDATE `player_data` SET kills=? WHERE player=?;"); 
      killsUpdate.setInt(1, kills.get(p.getName())); 
      killsUpdate.setString(2, p.getUniqueId().toString()); 
      killsUpdate.executeUpdate(); 

      PreparedStatement deathsUpdate = connection.prepareStatement("UPDATE `player_data` SET deaths=? WHERE player=?;"); 
      deathsUpdate.setInt(1, deaths.get(p.getName())); 
      deathsUpdate.setString(2, p.getUniqueId().toString()); 
      deathsUpdate.executeUpdate(); 

      deathsUpdate.close(); 
      killsUpdate.close(); 
      sql.close(); 
      sql2.close(); 
      result.close(); 
      result2.close(); 
     } 

    }catch(Exception e1){ 
     e1.printStackTrace(); 
    } finally{ 
     closeConnection(); 
    } 
} 

Всякий раз, когда вы присоединитесь, он говорит [20:51:43] не WARN: java.sql.SQLException: Не задано значение для параметра 1

И всякий раз, когда вы убиваете кого-либо или умираете, ваши убийства тогда равны нулю, а ваши смерти тогда равны нулю. Я не уверен, почему это происходит, любая помощь приветствуется.

ответ

2

Здесь вы не установили параметры PreparedStatement там, где это условие.

PreparedStatement sql = connection.prepareStatement("SELECT deaths FROM `player_data` WHERE player=?"); 
PreparedStatement sql2 = connection.prepareStatement("SELECT kills FROM `player_data` WHERE player=?"); 

Задайте параметры в соответствии с условиями данных типов данных. Например: readyStatement.setInt (1, 1001);

см это: https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

Для второго вопроса:

Pls установленных значения Hashmap следующего

 previousDeaths = result.getInt("deaths"); 
     previousKills = result2.getInt("kills"); 

     kills.put(p.getName(), previousKills); 
     deaths.put(p.getName(), previousDeaths); 

     PreparedStatement killsUpdate = connection.prepareStatement("UPDATE `player_data` SET kills=? WHERE player=?;"); 
     killsUpdate.setInt(1, kills.get(p.getName())); 
     killsUpdate.setString(2, p.getUniqueId().toString()); 
     killsUpdate.executeUpdate(); 
+0

и вы знаете, почему HashMaps не работает? – Awaken

+0

Кроме того, я не хочу устанавливать Integer on Join, я хочу получить целые числа и сохранить их в папке «Оставить». – Awaken

+0

В чем проблема с hashmap? –