使用OTL多线程高速访问oracle的问题!!!

FoxBryant 2011-08-19 11:10:09
公司刚接到一个电信行业的项目,要求是能够快速将从网络传过来的数据写入数据库(数万条/秒),同时还要进行查询、删除操作。

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


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

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

CCritialSection cs; //全局锁
otl_connect db;

otl_connect::otl_initialize(1); //指定多线程环境
db.rlogon(...);

...


//插入操作线程

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

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



//查询操作线程

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

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


//删除操作线程

...
cs.Lock();

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

cs.unlock();


...全文
511 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
FoxBryant 2011-09-01
  • 打赏
  • 举报
回复
谢谢大家的回复!

关于更多oracle多线程处理问题,请进:
http://topic.csdn.net/u/20110831/00/e041462f-411d-490c-97d0-b91921a39963.html
yixilan 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 foxbryant 的回复:]
楼上说的甚是,这样搞多线程我感觉速度也明显慢了。如果为每个线程分配一个connect对象,线程间不用去抢占connect对象资源应该会好些,只是不知道多线程同时提交同一个表的操作命令时,oracle是否也会多线程处理?
[/Quote]
ORACLE对于多个CONNECT,会同时处理,但是关键的是,多个CONNECT想要操作的还是同一张表。。
还是不能解决根本的锁的问题。
FoxBryant 2011-08-30
  • 打赏
  • 举报
回复
楼上说的甚是,这样搞多线程我感觉速度也明显慢了。如果为每个线程分配一个connect对象,线程间不用去抢占connect对象资源应该会好些,只是不知道多线程同时提交同一个表的操作命令时,oracle是否也会多线程处理?

数据过来后要马上入库(超过1秒种可能就会造成数据丢失),因为有其它的程序不停地去数据库中查询相应的数据,所以不能直接放在内存里。

看来只能尝试第三种方法了。

大家还有什么建议没有,特别是oracle对多线程处理的问题,小弟再次谢过!
yixilan 2011-08-26
  • 打赏
  • 举报
回复
1.流程上:我觉得倒不会有太大问题,因为你每次操作都是先LOCK,再UNLOCK的,只是如果发生插入线程和删除线程同时对某张表进行操作时,可能会因为抢占锁浪费些时间。
2.查询速度问题:
(1)因为表里数据量很大的时候,即使不通过程序,本身去数据库里直接执行SELECT语句就是很慢的,所以如果每次查询都访问数据库查,一定也是很慢的,这个好象不太好解决。除非使用内存数据库,就是TimesTen数据库,它会把大量的数据存到内存里,这样存取很快。但是你们已经定了使用Oracle数据库,也不能改了。
(2)如果说把INSERT或者UPDATE的数据先临时写到内存里,然后隔断时间再去真正操作数据库,写数据库的表,这样倒是可以,就类似于Oracle本身的写数据Buffer的机制。但是可能不太好实现。
(3)如果上述两种方法,都不行,那只能给表建索引,或者分区,在SELECT语句中,走索引,走分区。这样可能比较简单,效率可以提高一些,但是效果不是很明显。
FoxBryant 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lzd_83 的回复:]

NoSQL内存读取效率应该会高一些了。
[/Quote]

不光需要插入,同时还有查询和删除操作呢,处理并发操作,用NoSQL速度会可以吗?
lishuo102 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 java3344520 的回复:]

要试试NOSQL内存数据库?感觉不错,速度快,后端再慢慢处理
[/Quote]
计算机死机等异常时,数据怎么恢复呢?写文件,还是写数据库?
新丁11111 2011-08-22
  • 打赏
  • 举报
回复
关注学习中。。。。。。。
Rotel-刘志东 2011-08-22
  • 打赏
  • 举报
回复
NoSQL内存读取效率应该会高一些了。
FoxBryant 2011-08-21
  • 打赏
  • 举报
回复
再顶一下啊,求高手~
yjytiantang 2011-08-20
  • 打赏
  • 举报
回复
oracle下 select ,update 等操作时都会加锁,线程同时跑的话会不会有堵塞问题。。。
iwfieff 2011-08-20
  • 打赏
  • 举报
回复
高手赶紧给楼主解决一下问题,解决完后顺便帮我们讲讲Oracle调优培训课,有讲课费的哦,日薪800-1500元,Q我:QQ174629429,ciitc.com
iqlife 2011-08-20
  • 打赏
  • 举报
回复
要试试NOSQL内存数据库?感觉不错,速度快,后端再慢慢处理

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧