我真的是 java 的新手,我需要知道这是内存泄漏吗?
这是我正在尝试改进的游戏服务器中的一段代码:
private static void closePreparedStatement(PreparedStatement p)
{
try {
p.clearParameters();
p.close();
} catch (SQLException e) {e.printStackTrace();}
}
public static void UPDATE_ACCOUNT(Compte acc)
{
try
{
String baseQuery = "UPDATE accounts SET " +
"`bankGold` = ?,"+
"`bank` = ?,"+
"`level` = ?,"+
"`stable` = ?,"+
"`banned` = ?,"+
"`enemy` = ?"+
" WHERE `guid` = ?;";
PreparedStatement p = newTransact(baseQuery, dConnexion);
p.setLong(1, acc.getBankGold());
p.setString(2, acc.parseBankObjectsToDB());
p.setInt(3, acc.get_Lvl());
p.setString(4, acc.parseStable());
p.setInt(5, (acc.isBanned()?1:0));
p.setString(6, acc.parseEnemyListToDB());
p.setInt(7, acc.getGUID());
p.executeUpdate();
closePreparedStatement(p);
}catch(SQLException e)
{
LogClass.addErrorLog("MySQL ERROR: "+e.getMessage());
e.printStackTrace();
}
}
经过深思熟虑和阅读,我认为也许一个包含 closePreparedStatement(p) 的 finally catch block 是避免内存泄漏的好主意?
finally
{
closePreparedStatement(p);
}
如果是这样,那么我有很多工作要做,以这种方式更改数百种方法。 我只是想问问你们的意见,因为我是个新手,我以后会后悔的
需要一个答案,如果您对这段关于内存泄漏的代码有任何意见,请不要犹豫。
感谢您的宝贵时间。
最佳答案
您的 finally block 假设是正确的。例如,假设打开了一个连接,然后您的代码中出现错误。幸运的是(在某种程度上)你有一个 try catch block ,所以你可以捕获然后做你可能会遇到的错误天气它会抛出错误或显示错误或记录错误或以上所有(有很多方法可以处理有错误,每个错误都应该以一种或另一种方式处理)。不幸的是,如果在 catch block 中捕获到错误并且连接(可能到数据库或文件等)仍然打开,则连接正在占用资源并迫在眉睫源正在运行的机器。最后 block 释放这个连接是KEY 正如您的假设所预测的那样。
如果有多个连接,则泄漏可能发生在其他地方。根据经验,最好使用 finally block 来关闭已在 try block 中打开的连接。快乐编码!
关于java - 我的代码出现 mysql 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7095787/