Java 我的代码上的mysql内存泄漏?

Java 我的代码上的mysql内存泄漏?,java,mysql,Java,Mysql,我对java非常陌生,我需要知道这是内存泄漏吗 这是我试图改进的游戏服务器的一段代码: 经过大量的思考和阅读,我认为一个finallycatch块,里面有一个closePreparedStatement(p),可能是避免内存泄漏的好主意 finally { closePreparedStatement(p); } 如果是这样的话,那么我有很多工作要做,以这种方式改变数百种方法。 我只是在事后后悔之前问问你们的意见,因为我是个十足的新手 需要一个答案,

我对java非常陌生,我需要知道这是内存泄漏吗

这是我试图改进的游戏服务器的一段代码:



经过大量的思考和阅读,我认为一个finallycatch块,里面有一个closePreparedStatement(p),可能是避免内存泄漏的好主意

    finally
    {
        closePreparedStatement(p);
    }
如果是这样的话,那么我有很多工作要做,以这种方式改变数百种方法。 我只是在事后后悔之前问问你们的意见,因为我是个十足的新手

需要一个答案,如果你对这段关于内存泄漏的代码有任何意见,请不要犹豫


谢谢您的时间。

您的最后一块假设是正确的。比如说,打开了一个连接,然后代码中出现了一个错误。幸运的是(在某种程度上)您有一个try-catch块,因此您可以捕获并处理错误,无论是抛出错误、显示错误还是记录错误或以上所有情况(处理错误的方法有很多种,每个错误都应该以这样或那样的方式处理)。不幸的是,如果在catch块中捕获到错误,并且连接(可能到数据库或文件等)仍处于打开状态,则连接会占用资源,并即将出现源运行的机器。最后,释放此连接的块是关键,正如您的假设所预测的那样


如果存在多个连接,则泄漏可能发生在其他地方。根据经验法则,最好使用finally块关闭在try块中打开的连接。快乐编码!

给定代码,最终答案是不可能的,例如,如何在
newTransact
.你在哪里关闭连接

一般来说,
final
子句缺失是正确的,但您必须注意,在大多数情况下,您的preparedstatement已经关闭,只有在出现异常时才会丢失。总之,引入
final
块是好的,但我打赌它不会解决内存泄漏问题


您必须跟踪您的应用程序以找出泄漏的位置!

尝试关闭finally块中的语句绝对是最佳做法

您应该真正了解一下维基百科中关于JDBC的内容:这里有一些非常好的例子,说明了如何在不造成内存泄漏的情况下连接到Java中的数据库


编辑:如果您真的必须使用JDBC连接到数据库,我建议您使用Spring-有一个很棒的类JdbcTemplate,它隐藏了大量样板代码,您可以专注于重要的内容(从/到数据库获取数据),而不必担心内存泄漏。

如果以下语句中发生异常:

PreparedStatement p = newTransact(baseQuery, dConnexion);
那么p可能没有初始化,当您尝试在finally块中关闭它时,它将生成一个错误。现在,即使您的方法中有一个try-catch来关闭语句,但这不是一个应该记录的错误,因为原始错误已经被处理过。因此,我相信这是一个很好的实践,在这种方法中to在尝试关闭该语句之前,请检查该语句是否为null。因此,将您的方法修改为以下内容可能会更好:

    private static void closePreparedStatement(PreparedStatement p)
{
  if (p!=null){   
    try {
        p.clearParameters();
        p.close();
    } catch (SQLException e) {e.printStackTrace();}
  }
}

太好了!非常感谢你,先生。在Java 7中,有一个新的可以节省大量输入。谢谢!我会尝试一下。我的游戏中有一个非常缓慢的内存泄漏。假设正常运行时间为48小时,我得到大约500MB的内存泄漏(日志中有很多MySQL错误),我想使用finally可能会修复它。无论如何,非常感谢!
PreparedStatement p = newTransact(baseQuery, dConnexion);
    private static void closePreparedStatement(PreparedStatement p)
{
  if (p!=null){   
    try {
        p.clearParameters();
        p.close();
    } catch (SQLException e) {e.printStackTrace();}
  }
}