用DELPHI 开发ORACLE 数据库的问题。

fuzhenxing 2000-07-05 04:41:00
我用ADO和ODBC开发的程序速度都很慢
我要在一分钟内对ORACLE数据库增加两千条记录, 该用什么方法?
望高手多多指教....
...全文
472 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
水哥驿站 2000-07-08
  • 打赏
  • 举报
回复
fuzhenxing朋友,
你前边说的出现超出DML锁的最大数错误的问题,如果是用事务的话,可以分成几个事务来处理。
hsw 2000-07-07
  • 打赏
  • 举报
回复
>>
水哥驿站 2000-07-07
  • 打赏
  • 举报
回复
建议你用Query控件再加上事务处理,我试了一下,比用Table快了很多。例子如下:

function TAddData.QueryInput(DataBase1:TDatabase;cQuery:TQuery;recordnum:integer):boolean;
var
icount,i:integer;
ntmp:integer;
str:string;
sexflag:integer;
ftmp:single;

begin
randomize;

cQuery.Close;
cQuery.SQL.Clear;
cQuery.SQL.Add('insert into members_1 (工号,姓名,性别,年龄,所属车间) values(:id1,:id2,:id3,:id4,:id5)');

//事务开始
Database1.StartTransaction;

cquery.Prepare;
for icount:=1 to recordnum do
begin
//以下是往每个字段填数据
str:='';
str:=inttostr(icount);
for i:=1 to 5-length(str) do
str:='0'+str;
cquery.ParamByName('id1').asstring:=str;

str:='';
str:=str+strsurname[random(4)];
for i:=1 to 2 do
begin
ntmp:=random(19);
case ntmp of
2,3,5,6,10:sexflag:=1;
else
sexflag:=0;
end;
str:=str+strfirstname[ntmp];
end;
cquery.ParamByName('id2').asstring:=str;

str:='';
if sexflag=0 then
str:='男'
else
str:='女';
cquery.ParamByName('id3').asstring:=str;

ntmp:=18;
ntmp:=ntmp+random(42);
cquery.ParamByName('id4').asinteger:=ntmp;

ntmp:=trunc(random(29)/10);
str:=strplant[ntmp];
cquery.ParamByName('id5').asstring:=str;
//cquery.ParamByName('id5').asstring:='111';
//str:=cquery.SQL.Strings[0];
try
//执行SQL
cquery.execsql;

except
showmessage('写数据库出错!');
result:=false;
exit;
end;

end;
cquery.UnPrepare;
database1.Commit;

end;
fuzhenxing 2000-07-07
  • 打赏
  • 举报
回复
对不起,
名字打错了
应是lsx78朋友和nickw朋友。
加班时间太长, 大脑有些热。
:)
fuzhenxing 2000-07-07
  • 打赏
  • 举报
回复
lsx78朋友
racle朋友
你们好。 在这里先感谢这些热心的朋友.
我是一家网站的程序员 WWW.fuyou.com
网站其中的股票行情是由我负责的。 以前用SQL SERVER 时速度还可以,
每分钟将上交所和深交所的实时数据能及时转换到数据库中。
这一个转码程序要在每一分种内对交易所1200多只股票进行数据扫描。并以最大的速度写到数据库中去. 公司下一步要在网上实现股票交易, 所以要将后台数据库转到ORACLE中
去。
请朋友们多多指教. fuzhenxing
nickw 2000-07-07
  • 打赏
  • 举报
回复
racle是一个多进程的DBMS,每个连接实例都会触发一个进程,十分消耗数据库服务器的资源;而SQL SERVER 是多线程DBMS,多个线程共享一个进程空间,故消耗的系统资源要少的多,这就是同样的算法SQL SERVER比ORACLE快的原因。但另一方面ORACLE因此又比SQL SERVER稳定。
建议使用DELPHI的分布多层应用结构。建立应用服务器,并在该层使用DELPHI的DATABASE POOLING技术来优化程序。DATABASE POOLING 实际上就是数据库连接的重用技术,(即:当第一个用户连接数据库时数据库引擎要为该连接分派许多系统资源,当用户操作执行完毕后数据库引擎并不释放这些资源。而是等到另一个客户端连接同一个数据库时重用以前分配的资源,从而缩短连接时间;同时由于降低了服务器的负荷进而加快了数据库的响应速度。) 非常适用于大量用户访问而连接时间又很短情况。从你描述的情况来看(同时向一千个表中增加一条记录),非常适合使用这项技术。
fuzhenxing 2000-07-07
  • 打赏
  • 举报
回复
lsx78你好
我用你的方法实现了INSERT的速度问题, 但又出现了一条错误, 超出DML锁的最大
数, 是不是锁表太多了?


nickw 2000-07-07
  • 打赏
  • 举报
回复
Oracle是一个多进程的DBMS每个连接实例都会触发一个进程,十分消耗数据库服务器的资源;
而SQLSERVER 是多线程DBMS多个线程共享一个进程,故消耗的系统资源要少的多,这就是同
样的算法SQL SERVER比ORACLE快的原因。但另一方面ORACLE因此又比SQL SERVER稳定。
建议使用DELPHI的分布多层应用结构。建立应用服务器,并在该层使用DELPHI的DATABASE POOLING
技术来优化程序。
水哥驿站 2000-07-07
  • 打赏
  • 举报
回复
如果你的那一千个表的表名是顺序的,如:Table1,table2,...,那就可以用事务了,这样速度会更快
水哥驿站 2000-07-07
  • 打赏
  • 举报
回复
当然不用事务拉, 记住在query1.execsql之前要有query1.prepare.
fuzhenxing 2000-07-07
  • 打赏
  • 举报
回复
那样还能用事务吗?
水哥驿站 2000-07-07
  • 打赏
  • 举报
回复
fuzhenxing,
你说的在一千多个表中INSERT一条数据也可以用Query来做,我想总会比用Table要快点吧.
fuzhenxing 2000-07-07
  • 打赏
  • 举报
回复
lsx78你好。
现在有一问题是,我不是在一个表中INSERT
而是在一千多个表中INSERT一条数据。
u_L_u 2000-07-06
  • 打赏
  • 举报
回复
BTW,你用的带参数的存储过程一定是一次只加一条记录,如果这样就很慢!
u_L_u 2000-07-06
  • 打赏
  • 举报
回复
可以直接用ORACLE提供的API直接访问ORACLE,但这要用C++来完成了!
fuzhenxing 2000-07-06
  • 打赏
  • 举报
回复
带参数的存储过程和ADO的速度一样,还是慢.
halfdream 2000-07-06
  • 打赏
  • 举报
回复
通过ODBC访问肯定慢。
用BDE(非ODBC方式)比ODBC方式明显要快的,不过最好在前端安装一下相应版本ORACLE的客户端接口程序.
配置BDE用BDE Administrator :)
用缓存更新是可以的。在这种情况下,用了事务反而会更慢。
fuzhenxing 2000-07-06
  • 打赏
  • 举报
回复
dxz_pl 朋友你好, 有一个问题我要是用事务提交,就会把表锁定。这样别人就访问不到了。

lsx78 朋友, BDE应如何配置?

fuzhenxing 2000-07-06
  • 打赏
  • 举报
回复
我以前是用SQL Server开发的,速度是很快。
但转到Oracle之后就一落千丈了。 我用的Table控件追加的.
水哥驿站 2000-07-06
  • 打赏
  • 举报
回复
我想知道你是用什么方法加数据的,因为我试过SQL Server数据库,用Table控件一个一个记录加也只用了50秒. 我想如果采用事务处理,因该会更快一些的。
加载更多回复(4)

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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