什么是数据读取/存储应用程序的正确设计?

时间:2011-02-24 04:21:27

标签: java multithreading netbeans

我需要从网站上读取200,000条左右的记录并将它们存储在数据库中。该应用程序是在Netbeans富客户端平台上实现的桌面应用程序。通过使用Apache HttpComponent库,我可以向网站发送请求并检索包含记录信息的响应;然后使用正则表达式,我可以很容易地从HTML中提取我需要的十几个字段。

我想除了GUI线程之外还有2个工作线程。一个工作线程处理HTTP请求/响应部分,并使用正则表达式从HTML中提取记录;而另一个工作线程将记录存储到DB中。因此,将有一个数据结构来保存记录,以便它可以在两个工作线程之间共享。我也在考虑为HTTP工作者线程提供一个大小为100的缓冲区(例如)来存储记录,当缓冲区已满时,一次将100条记录传输给共享记录持有者。

请评论我的设计,我的问题是:

  1. 保存记录的正确数据结构是什么?
  2. 如何在两个工作线程之间进行同步?
  3. 如何在Netbeans平台的模块化系统中实现多线程?

2 个答案:

答案 0 :(得分:2)

  

保存记录的正确数据结构是什么?

取决于数据。可能是一个带有一堆字段的简单类(最好immutable使多个线程更安全)。

  

如何在两个工作线程之间进行同步?

其中一个BlockingQueue实现可能对此有利。 ArrayBlockingQueue可以用作固定大小的缓冲区,用于在线程之间传递工作。

  

如何在Netbeans平台的模块化系统中实现多线程?

不知道NetBeans平台是否有任何可说的内容。启动自己的线程应该可以工作。

答案 1 :(得分:1)

首先,这种HTML解析会严重降低您的应用速度。此外,代码将非常脆弱,因为HTML经常为了美学增强而改变。你应该采用'HTML scraping'作为最后的手段。一旦您解释了这些缺点,大多数客户同意为此开放网络服务/数据服务。

如果你真的没有其他选择,那么我认为你的方法很好。但是,不是等待缓冲区已满,而是可以让一组线程写入缓冲区,同时从缓冲区读取一组线程。我建议使用更多数量的HTTP scraper线程和更少数量的DB-write线程,因为HTTP请求 - 响应周期和HTML解析将比数据库写入慢一倍。