【发布时间】:2013-08-27 09:04:28
【问题描述】:
我开发了一个网络爬虫。 Web scraper 使用 6 个线程,每个线程打开一个网页,获取一篇文章的文本,然后(使用驱动程序)将文本的每个单词写入 mysql 数据库。
在程序执行期间,我得到一个 java mysql java.lang.OutOfMemoryError: Java heap space。我在Eclipse上安装了Memory Analyzer,发现问题是由mysql驱动连接引起的:当我运行这个程序时,5分钟后驱动占用的内存是6 MB,再过5分钟200MB,再过5分钟500Mb和然后我得到 java 错误堆空间。
我不明白为什么会这样。
这是我用于模型的代码(用于访问 mysql DB)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class model {
private Connection connect = null;
public model(){
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager.getConnection("jdbc:mysql://localhost/system?user=keyword_tool&password=l0gripp0");
} catch (Exception e) {
System.out.println(e);
}
}
public synchronized void insertCat(String parola, String categoria){
try{
PreparedStatement statement = connect.prepareStatement("insert into sostantivi (nome, categoria) values (?, ?)");
statement.setString(1, parola);
statement.setString(2, categoria);
statement.executeUpdate();
statement.close();
} catch (Exception e){
//System.out.println(e);
}
}
public void closeDBConnection() {
try {
connect.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
每个线程只需调用方法 insertCat 并在数据库中插入一个带有类别的单词。
Eclipse 的 Memory Analyzer 插件说:
【问题讨论】:
-
你怎么知道
closeDBConnection()被调用了?进行一些登录。由于您没有显示该代码,很可能是model()构造函数被重复调用,但由于您的代码中的某些缺陷,连接被泄露或未关闭。 -
我把 closeDbConnection() 放在了抓取程序的末尾。我在主类中创建了一个模型,每个线程都使用该模型。在抓取了我需要的东西之后,我在那个单一的模型上调用了 closeDBConnection。有错吗?
标签: java mysql eclipse multithreading