向各位高手请教:WebService 中数据入库效率很低,400 条记录竟然用到 2.343 秒, 求如何优化性能。

yyunffu 2008-06-18 03:11:09
cmd->CommandType = CommandType::StoredProcedure;
...全文
189 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyunffu 2008-06-19
  • 打赏
  • 举报
回复
16楼 caicai_45
我没太明白你的意思,是不是如下过程:
启动事务-〉循环执行-〉提交事务。
我的过程是这样的,比较简单,希望多多指点。
caicai_45 2008-06-19
  • 打赏
  • 举报
回复
你直接启动事务,最后循环完毕之后,用事务提交也可以
yyunffu 2008-06-19
  • 打赏
  • 举报
回复
批量执行,是否构建类似:
exec proc_sys_getLetChk ...
.
.
.

一批,之后送入数据库执行?

这是个好思路,我试试,估计的确会提高效率!
nec_741 2008-06-19
  • 打赏
  • 举报
回复
yyunffu 2008-06-19
  • 打赏
  • 举报
回复
现在通过定位测试,发现问题出在存储过程,去掉第一条判断语句,在按 15楼 方式更改程序,效率现在提高 10 倍以上,达到 0.2秒 级别,虽然还不是最理想,已经有很大改善。
多谢大家帮助!
s32702 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yyunffu 的回复:]
16楼 caicai_45
我没太明白你的意思,是不是如下过程:
启动事务-〉循环执行-〉提交事务。
我的过程是这样的,比较简单,希望多多指点。
[/Quote]
恩,是的
老田低代码 2008-06-18
  • 打赏
  • 举报
回复
与是不是webservice没有什么关系的吧。。这种循环应该弄成批量操作。这样估计在哪里执行都不可能好受的。。。
yyunffu 2008-06-18
  • 打赏
  • 举报
回复
这个过程是在数据集已经获得,通过循环存入数据库时测试的时间,不包括网络传输时间。
运用的是存储过程方式写入数据库。
存储过程如下:
proc proc_sys_getLetChk --从管理系统下载检查信息
(
@chkDesc varchar(300),
@LetRoomID varchar(20),
@chkTypeID int,
@chkResult int,
@WorkerID varchar(20)
)
as

declare @iErrors int
set @iErrors = 0

if(not exists(select * from CheckItems where LetRoomID = @LetRoomID
and WorkerID = @WorkerID
and chkTypeID = @chkTypeID))
begin
insert into CheckItems(chkDesc,LetRoomID, chkTypeID,chkResult,WorkerID)
values(@chkDesc,@LetRoomID,@chkTypeID,@chkResult,@WorkerID)
set @iErrors = @iErrors + @@error
end
else
begin
update CheckItems
set chkResult = @chkResult,
chkDesc = @chkDesc
where LetRoomID = @LetRoomID
and WorkerID = @WorkerID
and chkTypeID = @chkTypeID
set @iErrors = @iErrors + @@error
end

if(0 != @iErrors)
begin
return -1
end
else
begin
return 0
end
豆丁_ 2008-06-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wcscpy174740342 的回复:]
help you up......
[/Quote]
zhnzzy 2008-06-18
  • 打赏
  • 举报
回复
你的SQL语句怎么写的关键
greenery 2008-06-18
  • 打赏
  • 举报
回复
1 你在查询分析器执行 400次 proc_sys_getLetChk 是否要2秒?如果有,那么就调优你的存储过程吧.
2 WEB SERVICE的请求还需要经过打包XML的SOAP请求,收到后还要转换为你的参数,这一块其实也是性能的瓶颈.
yyunffu 2008-06-18
  • 打赏
  • 举报
回复
zbjg 4.对于Dataset的数据插入应该可以只调一次数据库,

如果这样可以实现,的确能大幅提高效率。现在我的做法是, 获取DataSet 中每一行,之后通过 SqlCommand 用存储过程写入数据库,这个执行次数等于 DataSet 中数据行数。执行次数确实比较多。
fuadam 2008-06-18
  • 打赏
  • 举报
回复
你在查询分析器里执行下,看看时间多少
zbjg 2008-06-18
  • 打赏
  • 举报
回复
1.你应该直接写代码测试下这400条记录入库的性能(也许问题不在webservice)
2.Dataset是一个较大的XML,请测试下下直接重webservice取这个Dataset的效率
3.找到问题后再考虑其他因素及优化。
4.对于Dataset的数据插入应该可以只调一次数据库,
烈火焚身 2008-06-18
  • 打赏
  • 举报
回复
help you up......
yyunffu 2008-06-18
  • 打赏
  • 举报
回复
感谢 jinjazz 回复。
情况是这样的:这个客户端是移动设备,WebService 是作为中间层,负责终端与后台系统之间数据交互。
yyunffu 2008-06-18
  • 打赏
  • 举报
回复
以上为主要代码,其中,数据行中每一列用如下方式取得:
DataColumn ^dcLetChkDesc = tbChk->Columns[L"rrsiicRemarks"], ^dcLetChkLetID = tbChk->Columns[L"rrsNum"],
^dcLetChkTypeID = tbChk->Columns[L"rrsiicID"], ^dcChkResult = tbChk->Columns[L"rrsiicResult"];


基本情况:
该 WebService 作为中介,介于客户端与后台管理系统之间,由客户端向 Webservice 发起请求,只后WebService 向后台管理系统请求获取数据,后台管理系统结果以 DataSet 参数形式传回。

问题:
在获得管理系统数据之后,发现如果数据 在大约 400 条左右,该段入库代码执行大约 2.343 秒 级别。如果在代码前后加事务处理,多人访问该方法时,将发生进程间事务锁定冲突,无法入库。
向各位高手求解:
代码编写是否合理? 如何进行优化,以提高入库效率?
jinjazz 2008-06-18
  • 打赏
  • 举报
回复
你如果不用webservcie呢?这个瓶颈应该是在数据库端,不会在客户端的
yyunffu 2008-06-18
  • 打赏
  • 举报
回复
cmd->Parameters->Add(L"@chkDesc",   SqlDbType::VarChar, 300);
cmd->Parameters->Add(L"@LetRoomID", SqlDbType::VarChar, 20);
cmd->Parameters->Add(L"@chkTypeID", SqlDbType::Int, 4);
cmd->Parameters->Add(L"@chkResult", SqlDbType::Int, 4);
cmd->Parameters->Add(L"@WorkerID", SqlDbType::VarChar, 20);
DateTime ^dtNow3 = DateTime::Now;
for each(DataRow^ dr in tbChk->Rows){
//DateTime ^dtNow3 = DateTime::Now;
if(dr->IsNull(dcLetChkDesc) || String::IsNullOrEmpty(dr[dcLetChkDesc]->ToString()->Trim()))
cmd->Parameters[0]->Value = DBNull::Value;
else
cmd->Parameters[0]->Value = dr[dcLetChkDesc]->ToString();

if(dr->IsNull(dcLetChkLetID) || String::IsNullOrEmpty(dr[dcLetChkLetID]->ToString()->Trim()))
cmd->Parameters[1]->Value = DBNull::Value;
else
cmd->Parameters[1]->Value = dr[dcLetChkLetID]->ToString();

if(dr->IsNull(dcLetChkTypeID))
cmd->Parameters[2]->Value = DBNull::Value;
else
cmd->Parameters[2]->Value = Convert::ToInt32(dr[dcLetChkTypeID]);

if(dr->IsNull(dcChkResult))
cmd->Parameters[3]->Value = DBNull::Value;
else
cmd->Parameters[3]->Value = Convert::ToInt32(dr[dcChkResult]);

cmd->Parameters[4]->Value = strWorkerID;

/*if(!m_dbAccess->RunProc(L"proc_sys_getLetChk", params1, sqlTran))
throw gcnew Exception();*/
cmd->ExecuteNonQuery();
//dtNowE = DateTime::Now;
//AddTest(strWorkerID, dtNow3, dtNowE, L"each", (int)RetEnum::RET_OK);
}
dtNowE = DateTime::Now;
AddTest(strWorkerID, dtNow3, dtNowE, L"DispatchTask1", (int)RetEnum::RET_OK);

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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