web service 更新大数据的问题

gorge_an 2007-04-16 06:47:49
由于业务需求,需要传输大批量的数据至webservice 更新数据库。
现在我的实现指导思想是分割需要更新的DataSet,然后分步上传至服务器更新,并且需要支持事务,如果任何一个数据集的更新出错,则前面所有更新的数据全部取消。

由于WebService是无状态的,并且我希望能够得到SqlTransaction的支持。
所以我在WebSerivice设定了一个Static的和这次更新相关的SqlTransaction,最后更新完成后调用SqlTransaction的Commit。

Static 的 Transaction我通过一个GUID来标识。多个WebService同时批量更新的时候通过GUID来找到对应的Transaction.

请问各位高手,这样做有什么后遗症没有?

另外对于这种大数据集的WebService更新有什么更好的方法吗?

多谢各位

...全文
553 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
CH_MARS 2007-04-17
  • 打赏
  • 举报
回复
up
kimmking 2007-04-17
  • 打赏
  • 举报
回复
觉得有这么几个问题:
1 并发问题:如果处理时间较长,时不时一直在锁表;如果不所表,会不会因为并发更新同一数据(或会滚)而产生脏数据。
2 cache了事务我觉得也不好,如果出错,没有释放掉这个事务,可能引起一系列问题
( 占表一直到超时,hashtable时间长了一直在发胖...)


对于问题1: 我不知道怎么解决:建议合理分片的大小。
问题2: 我觉得应该做一个类:封装一个事务,然后cache这个类的实例
在此类实例化时 实例化事务,每次调用webservice时,从hashtable取出此实例,
执行批量更新,。。。。。
析构函数里释放事务

整个过程 对webservice透明
--------------------------------------------------个人觉得只有结构上要好一些
用处 也许并不太大

kimmking 2007-04-17
  • 打赏
  • 举报
回复
remoting 可以 配置成http的
kimmking 2007-04-17
  • 打赏
  • 举报
回复
直接在服务器端使用dts需要提供数据
比如数据文件 也比较麻烦
gorge_an 2007-04-17
  • 打赏
  • 举报
回复
:) 多谢各位高手关注。

to:nicholascheung(我要的幸福)
remoting 方式我没有接触过,由于我们的程序只能安装在客户的现有服务器上,并且该服务器只能为我们打开80端口。所以我们主要通过WebSerice和服务器交互。不知道Remoting方式是能在这样的环境下有效的工作。先看看MSDN先 :)尝试一下。

另 to:KimmKing(秦风意动)
对于效率问题我也考虑到了,但是目前的实现的确是产生了大量的记录需要添加到服务器:(。上传至WebService的数据全部是改变过的。

期待关于并发问题的解决方案。

目前的实现伪代码如下:)

public class clsJob
{

private static Hashtable _BatchUpdateTransaction; // string GuidKey SqlTransaction;

[WebMethod]
public string BeginBatchUpdate()
{
// Create New Transaction and use GUID to indentify it . push it into hashtable
}

[WebMethod]
public bool BatchUpdate(DataSet dsUpdate,string strGUID)
{
// Get the Transaction by the guid key
// Update the Dataset
// if faled then RollBack the Transaction.
}

[WebMethod]
public void EndBatchUpdate(string strGUID)
{
// Get the Transaction by the GUID key
// Invoke the Transaction 's Commit.
// Close the Transaction and remove it from the hashtable.
}
}

请各位高手斧正。多谢




littlekeen 2007-04-17
  • 打赏
  • 举报
回复
直接使用数据库DTS服务不行吗?
用WebService来作大数据集的更新不好。
gorge_an 2007-04-17
  • 打赏
  • 举报
回复
多谢KimmKing(秦风意动)继续关注

对于你提的两个问题,是这个实现的致命点。对于数据的安全性以及正确性没有较好的考虑。

关于第一点并发的问题,我再做一点实验。看业务逻辑怎么处理会比较好。

第二点,如果处理不当的话HashTable会不断的发胖。并且打开的过多Connection对于服务器是十分致命的。但是对于你说的封装,我觉得不是彻底解决的办法。因为这个封装类同样也是被WebService的Static引用了,GC会不会自动回收这个类的实例呢?我不是很清楚。

这个实现本来的意思是期望太大的数据集的传输会导致WebService超时,并且客户端没有较好的响应。所以用一个BackGroundWorker分步的传输。并且可以给用户一个进度条显示进度,不要让用户没有任何预期的等死在这里:)

不过还好的是这个实现只是小范围内使用,赶工期,先跑起来:)抽空再仔细研究这个问题。

我会继续关注这个帖子,希望大家都参与讨论。:)
kimmking 2007-04-16
  • 打赏
  • 举报
回复
1 有一个并发的问题:记得微软给出了一个解决方案。url我忘了,sorry
2 效率问题:是否有大量数据冗余,能否更新只改变了的数据,Data。
上面提到的那个方案基于DataGridView给出了方法。

找到的话 再贴出来


------------------------------

继续关注
nicholascheung 2007-04-16
  • 打赏
  • 举报
回复
用remoting 啊!
客户端激活的(,客户端激活的对象在每个客户端的基础上保持状态)! 这样可以保持状态
尝试一下!
另:
用dcom也可以!搭配com+中的事务 也可以!
建议用第一种办法
yjwang0621 2007-04-16
  • 打赏
  • 举报
回复
关注
海里猿人 2007-04-16
  • 打赏
  • 举报
回复
帮你T。

12,162

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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