2016-11-02 45 views
1

我正在編寫一個統計插件,它在加入時從數據庫中檢索統計信息,將它們實現爲散列圖,並在退出時將它們實現到數據庫中,這樣做的原因是,每秒鐘都沒有像開放式連接那麼多滯後。從我的代碼中獲取我的控制檯中的一些錯誤

如果這意味着什麼,我正在使用MariaDB。

包含HashMap下面

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的參數設置爲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);

參見本: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

此外,我不想在Join上設置Integers,我想檢索整數,並將它們保存在Leave中。 – Awaken

+0

hashmap有什麼問題? –

相關問題