数据集成处理办法--生产者消费者模型处理

前几天遇到一个问题,自己处理了一下但是觉得还是不是能好吧,数据量大概是2百w左右吧,就是处理一类产品,实际需求是这样的:比如你要处理的产品信息会来自京东、当当、亚马逊、淘宝等等不同的站点,你需要自作自己的爬虫去爬取他们的数据,然后整合到自己的系统中去。这是遇到的问题是你在整合数据时会出现

  1. 产品在不同的站点中都存在,整合数据会去掉重复的。
  2. 产品可能是同一个,但是名称不同,整合的数据取什么名称。

最开始是自己老老实实的写了这个完成了一切的工作,但是发现系统的瓶颈很快就到了,最开始使用的jdbc原始操作也就是开链接à使用链接à关闭链接,最好改成了c3p0,这样就好些了,但是任然还是跑的很慢,真不知道程序去搞什么去了。

于是自己琢磨着,脑海里出现了很多想法,是不是链接不够用、是不是执行这么一次操作消耗的资源太多了、是不是因为爬取数据的代码太慢了,是不是数据整合处理出现了问题、是不是数据库插入出现了问题。

经过测试发现数据处理和插入都是正确的。最后想了想是不是因为数据的产生和处理出上处理一些同步问题。爬虫不就是制造产品的,而我的整合程序就是来消费产品的嘛,于是就采用了一下的方式:生产消费者的模型重新做了一次代码。

 

我的做法是将不同的站点视为一个生产者,我处理的程序视为消费者,消费者我是自己构建多少就是多少,站点爬虫是一个站点一个生产者。

于是开始改造自己的代码了

 

采用缓冲队列使生产者和消费者都能访问,不需要生产者和消费者通信,生产者和消费者各自只是负责处理缓冲队列就可以了,修改了的代码果然快了很多,想想也是哟,这样采用缓冲队列也能解决生产者和消费者之间的性能差,双方不用通信还确保了耦合度的问题。觉得还是可以的,测试时又发现了问题就是在几万条之前那个速度是相当快,可是怎么越来越慢了呢,心想程序又去干什么去了,这么慢,很快监控了下,发现我靠居然采用的c3p0的connection的close方法居然是关闭掉了连接了,getconnection是重新建立连接,我靠这个问题严重哟,找了很久也没发现c3p0怎样将使用的Connection放回到连接池中去呀,算了自己写个队列吧,再次测试,不错果然还可以。对于这个问题哪位朋友有高见,希望提供下,感激不尽。

posted on 2013-08-22 13:18  刀锋诚心  阅读(1380)  评论(9编辑  收藏  举报