2016-11-10 59 views
0

我怀疑这可能是误报,但我无法确定,所以我有点困惑。我正在使用Eclipse Neon,并在第三次准备声明时出现了这个问题。我在下面做几乎相同的事情,没有任何错误。PreparedStatement在准备语句时发生资源泄漏

try{ 
     Connection con = MySQL.connection; 
     PreparedStatement ps = con.prepareStatement("SELECT * from UsernameData " 
       + "WHERE UUID = '" + player.getUniqueId() + "'"); 
     ResultSet rs = ps.executeQuery(); 
     if(rs.next() == true){ 
      ps = con.prepareStatement("update UsernameData set UUID = ?, Username = ? where UUID = ?"); 
      ps.setString(1, uuid); 
      ps.setString(2, username); 
      ps.setString(3, uuid); 
      ps.execute(); 
      ps.close(); 
      rs.close(); 
      return; 
     } 
     ps = con.prepareStatement("insert into UsernameData(UUID, Username)" 
       + " values (?, ?)"); 
     ps.setString(1, uuid); 
     ps.setString(2, username); 
     ps.execute(); 
     ps.close(); 
     rs.close(); 
     return; 
    }catch(SQLException e){ 
     Bukkit.getServer().getLogger().warning("SQL Error: " + e); 
    } 

回答

0

,当你踩在脚下的ps您插入您不关闭第一组资源。

你也应该考虑使用try-与资源:

try (Connection con = MySQL.connection; 
      PreparedStatement ps = con.prepareStatement("SELECT * from UsernameData " 
        + "WHERE UUID = '" + player.getUniqueId() + "'"); 
      PreparedStatement ps2 = con.prepareStatement("update UsernameData set UUID = ?, Username = ? where UUID = ?"); 
      PreparedStatement ps3 = con.prepareStatement("insert into UsernameData(UUID, Username)" 
        + " values (?, ?)"); 
      ResultSet rs = ps.executeQuery()) { 
     if (rs.next() == true) { 
      ps2.setString(1, uuid); 
      ps2.setString(2, username); 
      ps2.setString(3, uuid); 
      ps2.execute(); 
      return; 
     } 
     ps3.setString(1, uuid); 
     ps3.setString(2, username); 
     ps3.execute(); 
     return; 
    } catch (SQLException e) { 
     Bukkit.getServer().getLogger().warning("SQL Error: " + e); 
    } 

是,第二和第三PreparedStatement时,可能浪费了。如果你喜欢,你可以将它们包装在自己的试用资源中。

但问题的症结在于你跺脚ps变量。

+0

嗯,这是有道理的,谢谢。 – Haydenman2

+0

不一定。我不认为它像任何一种最佳实践或重复使用相同语句或PreparedStatement变量的问题。我会站点这个http://stackoverflow.com/questions/850878/does-setting-java-objects-to-null-do-anything-anymore – Acewin

+0

只需使用ps.close()关闭语句;很好。潜在的泄漏并不是因为你在做ps.execute();或ps.close();这将是当你无法关闭它们。而且这是更重要的连接,因为直到你打电话给connection.close数据库时,假设你的连接是开放的,即使你通过设置连接变量为空来解除连接。 – Acewin