日期:2014-05-16  浏览次数:21004 次

使用OTL多线程高速访问oracle的问题!!!
公司刚接到一个电信行业的项目,要求是能够快速将从网络传过来的数据写入数据库(数万条/秒),同时还要进行查询、删除操作。

现在通过OTL流的批量提交方式,可以实现对无索引表的近10万条记录/秒的插入操作,但查询操作显得太慢了。表里只有几十万条数据还好,但当表里有上千万条记录的时候,查询和删除操作要等十几分钟。


请问各位大侠:
1. 有没有实现能够快速插入,同时又高效查询、删除操作的建议?
2. 现在我通过三个线程分别处理插入、查询、删除操作,以下操作流程会不会引起问题?

说明一下:因公司对代码有管控,上班的时候不能发贴,只能在家把大致流程写出来,各位多多原谅啊。

CCritialSection cs; //全局锁
otl_connect db; 
   
otl_connect::otl_initialize(1); //指定多线程环境
db.rlogon(...);

...


//插入操作线程
C/C++ code

...
cs.Lock();
otl_stream outStream(5000, "insert into test values(:f1<int>, :f2<char[20]>, ...", db);

//构造数据并写缓冲区
while(...)
{
   outStream << x << "123";
}
cs.unlock();




//查询操作线程
C/C++ code

...
cs.Lock();
otl_stream inStream(5000, "select * from test where ...", db);

//解析数据
while(...)
{
   inStream >> i;
   inStream >> str;
   ....
}
cs.unlock();



//删除操作线程
C/C++ code

...
cs.Lock();

otl_cursor::direct_exec(db, "delete from test where ...");

cs.unlock();





------解决方案--------------------
oracle下 select ,update 等操作时都会加锁,线程同时跑的话会不会有堵塞问题。。。
------解决方案--------------------
要试试NOSQL内存数据库?感觉不错,速度快,后端再慢慢处理
------解决方案--------------------
高手赶紧给楼主解决一下问题,解决完后顺便帮我们讲讲Oracle调优培训课,有讲课费的哦,日薪800-1500元,Q我:QQ174629429,ciitc.com
------解决方案--------------------
关注学习中。。。。。。。
------解决方案--------------------
NoSQL内存读取效率应该会高一些了。
------解决方案--------------------
探讨

要试试NOSQL内存数据库?感觉不错,速度快,后端再慢慢处理

------解决方案--------------------
1.流程上:我觉得倒不会有太大问题,因为你每次操作都是先LOCK,再UNLOCK的,只是如果发生插入线程和删除线程同时对某张表进行操作时,可能会因为抢占锁浪费些时间。
2.查询速度问题:
(1)因为表里数据量很大的时候,即使不通过程序,本身去数据库里直接执行SELECT语句就是很慢的,所以如果每次查询都访问数据库查,一定也是很慢的,这个好象不太好解决。除非使用内存数据库,就是TimesTen数据库,它会把大量的数据存到内存里,这样存取很快。但是你们已经定了使用Oracle数据库,也不能改了。
(2)如果说把INSERT或者UPDATE的数据先临时写到内存里,然后隔断时间再去真正操作数据库,写数据库的表,这样倒是可以,就类似于Oracle本身的写数据Buffer的机制。但是可能不太好实现。
(3)如果上述两种方法,都不行,那只能给表建索引,或者分区,在SELECT语句中,走索引,走分区。这样可能比较简单,效率可以提高一些,但是效果不是很明显。
------解决方案--------------------
探讨
楼上说的甚是,这样搞多线程我感觉速度也明显慢了。如果为每个线程分配一个connect对象,线程间不用去抢占connect对象资源应该会好些,只是不知道多线程同时提交同一个表的操作命令时,oracle是否也会多线程处理?