gpt4 book ai didi

java - 为什么crawler4j随机挂起?

转载 作者:行者123 更新时间:2023-12-02 05:37:54 31 4
gpt4 key购买 nike

我已经使用crawler4j几个月了。我最近开始注意到它卡在某些网站上并且永远不会返回。推荐的解决方案是将 resumable 设置为 true。这对我来说不是一个选择,因为我的空间有限。我进行了多次测试,发现挂起是非常随机的。它将爬行 90-140 个网址,然后停止。我以为可能是该网站的问题,但网站 robots.txt 中没有任何可疑之处,并且所有页面均响应 200 OK。我知道爬虫没有爬行整个网站,否则它会关闭。可能是什么原因造成的?我应该从哪里开始?

有趣的是我用非阻塞启动爬虫,然后是一个 while 循环检查状态

controller.startNonBlocking(CrawlProcess.class, numberOfCrawlers);

while(true){
System.out.println("While looping");
}

当爬虫挂起时,while 循环也停止响应,但线程仍然 Activity 。这意味着整个线程没有响应。因此,我无法发送关闭命令。

更新我弄清楚是什么导致它挂起。我在访问方法中的 mysql 步骤中运行了一个存储。该步骤如下所示:

public void insertToTable(String dbTable, String url2, String cleanFileName, String dmn, String AID, 
String TID, String LID, String att, String ttl, String type, String lbl, String QL,
String referrer, String DID, String fp_type, String ipAddress, String aT, String sNmbr) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
try{
String strdmn = "";
if(dmn.contains("www")){
strdmn = dmn.replace("http://www.","");
}else{
strdmn = dmn.replace("http://","");
}
String query = "INSERT INTO "+dbTable
+" (url,filename, dmn, AID, TID, LID, att, ttl, type, lbl, tracklist, referrer, DID, searchtype, description, fp_type, ipaddress," +
" aT, sNmbr, URL_Hash, iteration)VALUES('"
+url2+"','"+cleanFileName+"','"+strdmn+"','"+AID+"','"+TID+"','"+LID+"','"+att+"','"+ttl+"','"+type+"'" +
",'"+lbl+"','"+QL+"','"+dmn+"','"+DID+"','spider','"+cleanFileName+"','"+fp_type+"'," +
"'"+ipAddress+"','"+aT+"','"+sNmbr+"',MD5('"+url2+"'), 1) ON DUPLICATE KEY UPDATE iteration = iteration + 1";
Statement st2 = null;
con = DbConfig.openCons();
st2 = con.createStatement();
st2.executeUpdate(query);
//st2.execute("SELECT NOW()");
st2.close();
con.close();
if(con.isClosed()){
System.out.println("CON is CLOSED");
}else{
System.out.println("CON is OPEN");
}
if(st.isClosed()){
System.out.println("ST is CLOSED");
}else{
System.out.println("ST is OPEN");
}
}catch(NullPointerException npe){
System.out.println("NPE: " + npe);
}
}

非常有趣的是当我运行 st2.execute("SELECT NOW()"); 时而不是当前的 st2.execute(query);它工作正常并且可以爬行网站而不会挂起。但由于某种原因 st2.execute(query) 导致它在几次查询后挂起。它不是mysql,因为它不输出任何异常。我想也许我从 mysql 得到了“太多连接”,但事实并非如此。我的流程对任何人都有意义吗?

最佳答案

finally block 的重要性。

crawler4j 正在使用 c3p0 池插入到 mysql 中。经过几次查询后,爬虫将停止响应。感谢 @djechlin 的建议,事实证明这是 c3p0 中的连接泄漏。我添加了如下所示的finally block ,现在效果很好!

try{
//the insert method is here
}catch(SQLException e){
e.printStackTrace();
}finally{
if(st != null){
st.close();
}
if(rs != null){
rs.close();
}

}

关于java - 为什么crawler4j随机挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24807637/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com