MySQL库导致的Java内存泄漏
我有一个线程,它执行并用一些值更新数据库。我注释掉了对数据所做的所有操作,只留下了下面可以看到的行。当使用下面的代码行运行程序时,我发现内存泄漏 这是VisualVM中的外观 Mysql类MySQL库导致的Java内存泄漏,java,mysql,jdbc,memory-leaks,Java,Mysql,Jdbc,Memory Leaks,我有一个线程,它执行并用一些值更新数据库。我注释掉了对数据所做的所有操作,只留下了下面可以看到的行。当使用下面的代码行运行程序时,我发现内存泄漏 这是VisualVM中的外观 Mysql类 public ResultSet executeQuery(String Query) throws SQLException { statement = this.connection.createStatement(); resultSet = statement
public ResultSet executeQuery(String Query) throws SQLException {
statement = this.connection.createStatement();
resultSet = statement.executeQuery(Query);
return resultSet;
}
public void executeUpdate(String Query) throws SQLException {
Statement tmpStatement = this.connection.createStatement();
tmpStatement.executeUpdate(Query);
tmpStatement.close();
tmpStatement=null;
}
线程文件
public void run() {
ResultSet results;
String query;
int id;
String IP;
int port;
String SearchTerm;
int sleepTime;
while (true) {
try {
query = "SELECT * FROM example WHERE a='0'";
results = this.database.executeQuery(query);
while (results.next()) {
id = results.getInt("id");
query = "UPDATE example SET a='1' WHERE id='"
+ id + "'";
SearchTerm=null;
this.database.executeUpdate(query);
}
results.close();
results = null;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
很多人在研究了网络之后也遇到了这个问题
如果您在google上搜索“jdbc4resultset内存泄漏”,请确保显式关闭数据库连接。泄漏是您的,而不是MySQL的。你没有结束声明 你的方法设计得很差。它应该关闭语句,并且应该返回一些在关闭语句后仍然有效的内容,例如
CachedRowSet
否则它就不应该存在。它只有三行,而且不支持查询参数,所以没有多大用处。我会删除它
您似乎还将语句
作为实例成员,这几乎是不正确的。它应该是本地的方法。目前,您的代码甚至不是线程安全的
您还应该在finally块中关闭
ResultSet
,以确保它被关闭。同上语句
每个线程如何获取它的连接
对象?很有可能问题就在这里,每次创建一个新语句都会带来很大的开销。查看PreparedStatement
以减少开销(处理和网络),提高性能,并提高安全性(自动转义特定于数据库的关键字以防止SQL注入)。看起来您正在泄漏ResultSet
实例。你可以把它们扔到垃圾堆里,看看它们被抓在哪里。我敢肯定你哪里出了问题。。。我每天使用mysql jdbc 4.0驱动程序(事实上,自从它出现在生产代码中以来,每天使用数千次),并且没有任何已知的由它引起的泄漏。