开了5个线程,它们共用一个连接,即一个静态的OracleConnection,这5个线程同时执行一个SQL语句进行查询,比如select * from MyTable where name='aaa',即5个线程同时查询同一个表的同一条记录,查询的结果是用的OracleDataAdapter的Fill方法,返回一个结果集DataSet,每个线程new一个OracleDataAdapter和DataSet,当这几个线程同时执行到OracleDataAdapter的Fill方法的时候,就都卡死在这里了,请教高手谁知道这是怎么回事,该怎么解决这种情况?在C#程序中,用lock方法让每个线程函数串行执行,这样是可以解决问题的,但这样解决的话,如果有多个查询同时进行,那就会等待很长时间才能完成,效率就低了,不知道在oracle数据库层有没有别的解决办法。

解决方案 »

  1.   

    这个不关oracle底层的事情,并发查询是数据库的最基本功能之一。估计是你用ODBC API方式不对或者你的ODBC不支持数据库的多线程处理。从你的描述来看,串行可以,并行不行,应该是你用的API库不支持多线程并行。
      

  2.   

    今天又测试了一下,发现是这样的:如果需要并发查询表中的BLOB类型字段就会锁死在那,如果不查询该类型字段就可正常运行,不知道BLOB类型为什么会有这样的问题?期待高手来解答一下。
      

  3.   

    可能是你的底层不支持BLOB并行或者有bug,找底层高版本试试?
      

  4.   

    好像BLOB的读取是特殊一些的,试试把BLOB和其他字段的读取分开处理看看是否会有问题,或者只读取BLOB字段select blob from MyTable where name='aaa'