2013-06-17 2 views
0

У меня есть данные (сетевые пакеты), которые необходимо вставить в базу данных Cassandra!Вставьте данные в Cassandra

К сожалению, моему приложению требуется около 1 минуты для вставки 10000 пакетов!

Я ищу, если есть кто-нибудь, кто может помочь мне управлять концепцией многопоточности java до ускорить вставка! Вот мой код:

PcapPacketHandler<String> jpacketHandler; 
jpacketHandler = new PcapPacketHandler<String>() { 
    GestionPacketDAO g1; 
    int row=0; 

    public void nextPacket(PcapPacket packet, String user) { 
     row++; 

     String s = packet.toHexdump(); 

     try { 
      g1 = new GestionPacketDAO();     
      g1.Insert(s, row);// Insert is the function which inserts data into database 
     } 
     catch (InvalidRequestException exg) { 
      Logger.getLogger(AccueilInsertion.class.getName()).log(Level.SEVERE, null, exg); 
     } 
     catch (TException exg) { 
      Logger.getLogger(AccueilInsertion.class.getName()).log(Level.SEVERE, null, exg); 
     } 
    } 
} 

ответ

0

Обычная картина:

  • Используйте ThreadPoolExecutor с, может быть, 10 нитями.
  • Используйте клиентскую библиотеку, которая объединяет пул соединений (например, Astyanax или Java-драйвер DataStax CQL3). Убедитесь, что существует как минимум столько подключений, что потоки.
  • Отведите ThreadPoolExecutor по очереди фиксированного размера (например, ArrayBlockingQueue)
  • производителя, в вашем случае функция nextPacket, вызывает ThreadPoolExecutor.execute, который добавляет Runnable в очередь. Вам нужно обрабатывать, когда ваша очередь заполняется надлежащим образом, обрабатывая исключение RejectedExecutionException. Вы можете спать и блокировать чтение ваших пакетов или отбрасывать пакет или альтернативу.

Альтернативой является использование нескольких потоков, выполняющих обработчик пакетов, если это возможно. Каждый может иметь свое собственное соединение Cassandra и писать напрямую. Это будет более эффективно, если вы сможете это сделать.

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