2016-11-02 4 views
1

저는 join시 stats 플러그인을 코딩하고 해시 맵으로 구현하고 종료 할 때 데이터베이스에 새로운 stats를 구현합니다. 그 이유는 매 초마다 연결을 여는 것과 같은 지연이 없기 때문입니다.내 콘솔에서 코드에서 약간의 오류가 발생했습니다.

이것이 의미하는 바라면 MariaDB를 사용하고 있습니다. java.sql.SQLException의 :

@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(); 
    } 
} 

아래

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

코드 아래

가 HashMaps을 당신이 가입 할 때마다, 그것이 말하는 [20시 51분 43초는 WARN 없다]를 매개 변수 1

에 대해 지정되지 값을

누군가를 죽이거나 죽을 때마다 당신의 죽음은 무효가되어 사망자는 null이됩니다. 왜 이런 일이 일어나고 있는지 모르겠다. 어떤 도움을 주셔서 감사합니다.

답변

2

여기서 PreparedStatement에 대한 매개 변수를 where 조건으로 설정하지 않았습니다.

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

조건 데이터 유형에 따라 매개 변수를 설정하십시오. 예 : preparedStatement.setInt (1, 1001);

 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

을 다음과 같이

Pls는 설정 해시 맵의 값과 HashMaps을이 작동하지 않는 이유를 알 수 있습니까 : 두 번째 질문에 대해 https://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

:

이를 참조하십시오? – Awaken

+0

또한 Join에 Integers를 설정하지 않고 정수를 검색하여 Leave에 저장하려고합니다. – Awaken

+0

hashmap의 문제점은 무엇입니까? –

관련 문제