采集系统将采集到的数据保存到数据库中,同一种类型的保存到同一张表里,采集的时候用的是多线程,这样就有可能同时存一张表有多个线程。不知道这样会不会提高速度?另外 我想问一下大家, insert表的时候,orcale是不是默认的也是互斥的,即若有一个线程在插入,另一个线程就得等待其完成。若我用的线程都不是同一个数据库连接,也要等待另一个线程完成么?多谢!

解决方案 »

  1.   

    我也是那样感觉,但老大说oracle 应该解决了这个问题,让我查,查了一天,感觉还是得加锁,如果加锁,互斥,跟一个线程又有什么区别呢? 同一个表的操作,我觉得很难,就像多个线程同时像一个文件中写数据一样,加了锁,感觉就像一个线程,没有提高多少速度!
      

  2.   

    只是提交到oracle处理insert语句的速度快点,但是插入时肯定还是要排队的。
    如果仅仅是简单的提交insert语句到oracle,而没有耗时间的逻辑去生成insert语句,建议你不要用多线程。
      

  3.   

    你所说的"orcale是不是默认的也是互斥的"
    这个可能是要看你Orcale的设置吧,它有什么表锁,行锁什么的.
    关键是看你怎么设置它.
      

  4.   

    紧紧是插入,采集到的数据保存到缓冲区里,直接冲缓冲区里取出数据,插入到表当中,同一个缓冲区对应于同一个表。 我也看了,“ORACLE自动提供行级锁,它允许用户在没有冲突的情况下更新表中不同的行。行级锁对联机事务处理非常有用。” 不知道这样子是不是就说可以多个线程同时向表里插入数据,不用等待其他的线程插入完成?
      

  5.   

    如果你的这个处理是在一个紧密的处理过程中完成的多线程处理,我认为它不会快的。
    多线程是利用操作系统在不同的进程之间切换时空闲时间来达到所谓的快的目的的,但是一般一个紧密的处理过程,操作系统不会将控制权转移到其它的进程上的,举个例子,你在程序中作个死循环,你看看会出现什么情况,CPU的占用率一直是100%,明白了吧。
    而且这种情况下,你使用多情况,会造成操作系统不停的在多个线程之间切换控制权,增加系统的开销,反而会降低速度;
    数据库的数据处理是以事务为框架的,是否会出现你的情况要看你的这些线程是否在同一个事务内,如果在一个事务内,这些处理到达数据库时还是一个串行的过程,其实速度的瓶颈这也算是一个,除非数据库的事务支持多线程,呵呵;如果你的多线程在不同的事务中,那么就有可能出现你说的互斥操作,这要看表的锁级别来定。
      

  6.   

    我像是没有定义过事务呢:)多谢大家的解答。不过ThreadSharp(ThreadSharp V2006) 你好厉害哦.再问 如果每次插入完之后,等待一段时间,效果会不会好些?为了防止采集的数据及时地保存,我们没有采用批处理,而是来一条处理一条,多线程来的数据,多线程存,呵呵,想是这样想了,关键是觉得还是有问题呢:(
      

  7.   

    LZ思路错误了。采集的时候多线程对的,因为网速带来的延迟非常的明显,而添加进数据库确比采集速度快的多的多。采集的瓶颈来自网速、检查文章是否已经存在、规则分析。一个小时能采集5千篇以上,还不满足??我的http://www.mytopwin.com/ArticleIndex.html就是采集来的现在天天进行优化采集代码。