2013-05-17 3 views
1

Я пытаюсь понять Crawler4j с открытым исходным кодом веб-искатель. В среднем в то время как у меня есть некоторые сомнения, что как следует,Что такое StatisticsDB в Crawler4j с открытым исходным кодом?

Вопросы: -

  1. Что StatisticsDB делать в классе счетчиков, и объясните, пожалуйста, следующую часть кода,

    .
    public Counters(Environment env, CrawlConfig config) throws DatabaseException { 
        super(config); 
    
        this.env = env; 
        this.counterValues = new HashMap<String, Long>(); 
    
        /* 
        * When crawling is set to be resumable, we have to keep the statistics 
        * in a transactional database to make sure they are not lost if crawler 
        * is crashed or terminated unexpectedly. 
        */ 
        if (config.isResumableCrawling()) { 
         DatabaseConfig dbConfig = new DatabaseConfig(); 
         dbConfig.setAllowCreate(true); 
         dbConfig.setTransactional(true); 
         dbConfig.setDeferredWrite(false); 
         statisticsDB = env.openDatabase(null, "Statistics", dbConfig); 
    
         OperationStatus result; 
         DatabaseEntry key = new DatabaseEntry(); 
         DatabaseEntry value = new DatabaseEntry(); 
         Transaction tnx = env.beginTransaction(null, null); 
         Cursor cursor = statisticsDB.openCursor(tnx, null); 
         result = cursor.getFirst(key, value, null); 
    
         while (result == OperationStatus.SUCCESS) { 
          if (value.getData().length > 0) { 
           String name = new String(key.getData()); 
           long counterValue = Util.byteArray2Long(value.getData()); 
           counterValues.put(name, counterValue); 
          } 
          result = cursor.getNext(key, value, null); 
         } 
         cursor.close(); 
         tnx.commit(); 
        } 
    } 
    

насколько я понимаю, это экономит искателем URLS, что помогает в том случае, когда гусеничный разбитого, то веб-сканер не нужно начинать с быть хлопкоочистительных. Не могли бы вы объяснить приведенный выше код за строкой, пожалуйста.

2. Я не нашел никакой хорошей ссылки, которая объясняет мне SleepyCat, поскольку Crawlers4j использует SleepyCat для хранения промежуточной информации. Поэтому, пожалуйста, скажите мне хороший ресурс, откуда я могу узнать основы SleepyCat. (Я не знаю, в чем смысл транзакции, курсор используется в приведенном выше коде).

Помогите мне пожалуйста. Ищите свой добрый ответ.

+0

пожалуйста, воздержитесь/принимайте, если он ответит на ваш вопрос – Julien

+0

@JulienS. Он ответил на мой вопрос. – devsda

ответ

1

В основном Crawler4j загружает существующую статистику из базы данных, загружая все значения из БД. На самом деле код довольно неверен, поскольку транзакция открыта и никаких изменений в БД не производится. Поэтому линии, относящиеся к tnx, могут быть удалены.

Комментарии построчно:

//Create a database configuration object 
DatabaseConfig dbConfig = new DatabaseConfig(); 
//Set some parameters : allow creation, set to transactional db and don't use deferred write 
dbConfig.setAllowCreate(true); 
dbConfig.setTransactional(true); 
dbConfig.setDeferredWrite(false); 
//Open the database called "Statistics" with the upon created configuration 
statisticsDB = env.openDatabase(null, "Statistics", dbConfig); 

OperationStatus result; 
//Create new database entries key and values 
    DatabaseEntry key = new DatabaseEntry(); 
    DatabaseEntry value = new DatabaseEntry(); 
//Start a transaction 
    Transaction tnx = env.beginTransaction(null, null); 
//Get the cursor on the DB 
    Cursor cursor = statisticsDB.openCursor(tnx, null); 
//Position the cursor to the first occurrence of key/value 
    result = cursor.getFirst(key, value, null); 
//While result is success 
    while (result == OperationStatus.SUCCESS) { 
//If the value at the current cursor position is not null, get the name and the value of  the counter and add it to the Hashmpa countervalues 
     if (value.getData().length > 0) { 
      String name = new String(key.getData()); 
      long counterValue = Util.byteArray2Long(value.getData()); 
      counterValues.put(name, counterValue); 
     } 
     result = cursor.getNext(key, value, null); 
    } 
    cursor.close(); 
//Commit the transaction, changes will be operated on th DB 
    tnx.commit(); 

Я также ответил на подобный вопрос here. О SleepyCat, вы говорите о this?

Смежные вопросы