有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么crawler4j随机挂起?

我已经使用crawler4j几个月了。我最近开始注意到,它挂在一些网站上,永远不会回来。建议的解决方案是将Resubable设置为true。这不是我的选择,因为我的空间有限。我进行了多次测试,发现挂起的情况非常随机。它将在90-140个URL之间爬行,然后停止。我想可能是网站,但网站上没有可疑的东西。txt和所有页面响应200 OK。我知道爬虫程序没有爬过整个站点,否则它会关闭。这可能是什么原因造成的?我应该从哪里开始

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

controller.startNonBlocking(CrawlProcess.class, numberOfCrawlers);

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

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

更新 我知道是什么导致它挂起来的。我在visit方法中的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时。执行(“立即选择()”;而不是当前的st2。执行(查询);它工作良好,可以在不挂起的情况下爬行。但出于某种原因,st2。execute(query)使它在几次查询后挂起。它不是mysql,因为它不输出任何异常。我想也许我从mysql获得了“太多的连接”,但事实并非如此。我的过程对任何人都有意义吗


共 (1) 个答案

  1. # 1 楼答案

    最后一块的重要性

    crawler4j使用c3p0池插入mysql。在一些查询之后,爬虫程序将停止响应。由于@djechlin的建议,c3p0中的连接泄漏。我添加了下面这样的最后一个块,现在效果很好

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