2011-07-18 20 views
4

我有以下的情况并行线程的数据库访问,可行的选项?

main() 
{ 

    hnd = CreateTHread(func1); 

    // Call fun2() 

    wait(hnd); 

    return ; 

} 


fun2() 
{ 
    //Access database to perform some read operation on TAble A 
} 


func1() 
{ 

//Access database to perform some read operation on TAble A 
// Recursive operations 
} 

我观察到,fun2()需要更长的时间才能完成,如果我使用的线程方法。这可能是因为THread func和fuc2在同一张桌子上工作。请注意,这两个函数中只有一个读取操作。该AWR报告建议,查询exectutions的数量增加时使用

+0

你忘了在这里提到最重要的东西?数据库是什么和你使用的驱动程序是什么?你的数据库驱动程序做同步请求或行为像一个队列?你通过单一连接访问它吗? –

+0

@yy_H我使用oracle 11G作为我的数据库。我为线程启动一个单独的事务。如何检查数据库驱动程序是否同时执行请求? –

+1

如果文档不说创建长时间运行的请求并尝试运行同时请求。 –

回答

1

类似的问题穿线方法 - Multi-threaded database read access

甲骨文JDBC接口以及Oracle本地驱动器(我想)能够处理多线程请求(http://www.cs.umbc.edu/portal/help/oracle8/java.815/a64685/tips1.htm

但是,当涉及到在数据库引擎中的实现 - 这是不明确的。从目前的文档中我的理解是,只要你的请求是READONLY而不打算更新,就不会发生锁定,你应该看到性能提升(至少是次要的)。

然而,还有很多其他因素决定引擎是否使用并行性。服务器(多核)等的硬件配置也可以确定查询引擎采取并行还是排队方式。

顺便提一下,你在两种方法中观察到了多少时差。你的数据有多大?

+0

如前所述,fun2()在线程中调用fun1()时性能下降。我一直在使用双核心。表格的大小是中等的。唯一的区别是,fun2适用于View和Fun1,因为我使用的是默认的隔离级别READ COMMITTED –

1

尝试将隔离级别更改为READ COMMITTED并使用READ ONLY“clause”进行查询。它应该更少限制,并允许您同时读取相同的表格。

+0

上工作。如果您使用READ COMMITTED隔离级别和READONLY查询,并且仍然看到问题,那么我(目前为止)只有一个理由:它可能是因为每个(主要和创建的)线程都将其数据存入内存,然后出现其他线程,并将此数据交换到磁盘以便自带数据,那么其他线程就会再次从磁盘交换数据 - 所以内存抖动。你可以检查有无线程的内存使用情况。 –

+1

,因此我在实际的表 –

1

尝试使用两个不同的连接。多线程访问同一个表的同一个连接总是会降低性能,你正在为连接本身施加压力。你没有说你使用哪个驱动来访问,但是我已经在Oracle 10中测试了一个类似JDBC驱动的方法,并且性能有所下降,我猜测如果你使用相同的连接,SQL命令有点像流水线一样。

+0

我为每个线程使用不同的连接 –

+0

你有多少退化? 5%,10%,80%? 10%或更少是可以接受的,80%当然不是。你能分享一下你的观点吗? – ruhalde

+0

@ ruhalde降级约为50% –

0

并发性总会让你失去性能。如果你需要并发性,你将不得不忍受这一点;如果你不需要它,你不应该使用它!

SQL中的某些操作(如“count”)在表中执行LOCK。你可以分享你的SQL吗?

+0

即使我在不​​同线程的列上进行选择,oracle是否锁定表? –