0

我有要插入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);
        }
    }
}
4

1 回答 1

0

一个常见的模式是:

  • 使用可能有 10 个线程的 ThreadPoolExecutor。
  • 使用执行连接池的客户端库(例如 Astyanax 或 DataStax CQL3 java 驱动程序)。确保至少有与线程一样多的连接。
  • 通过固定大小的队列(例如 ArrayBlockingQueue)返回 ThreadPoolExecutor
  • 生产者,在你的例子中是 nextPacket 函数,调用 ThreadPoolExecutor.execute,它将一个 Runnable 添加到队列中。您需要通过处理 RejectedExecutionException 来适当地处理队列已满的情况。您可以休眠并阻止读取数据包或丢弃数据包或其他替代方法。

如果可能的话,另一种方法是让多个线程运行您的数据包处理程序。每个都可以有自己的Cassandra连接,直接写。如果你能做到,那会更有效率。

于 2013-06-18T07:16:55.317 回答