当前位置: 代码迷 >> C# >> 高分求json数据高速写入数据库的方法
  详细解决方案

高分求json数据高速写入数据库的方法

热度:368   发布时间:2016-05-05 05:17:59.0
高分求json数据快速写入数据库的方法。
本帖最后由 u010349289 于 2015-01-04 09:10:39 编辑
从口袋通(现在叫有赞)API获得订单数据(json格式,接口的说明见http://open.koudaitong.com/doc/api?method=kdt.trades.sold.get),每次可以返回数千个订单,每个订单数据包括订单的head部分,订单的明细部分。我现在的做法比较土,如下

string ret = 获取json返回结果的方法;
//将json反序列化为JObject
JObject jo = (JObject)JsonConvert.DeserializeObject(ret);
//将订单结构转成JArray对象,阵列里面就是每一张订单数据
JArray ja = (JArray)JsonConvert.DeserializeObject(jo.First.First.Last.First.ToString());

然后对JArray做循环,每个订单的head写入订单head表,对每张订单里的明细部分再次转成JArray,逐条写入订单明细表。
这样做的速度很慢,求最快最方便的将订单数据写入到数据库的方法。
------解决思路----------------------
只能批量插入。
先解析SQL转成dataset。再用SqlBulkCopy批量插入
------解决思路----------------------
先一条条解释成一个dataset,然后dataset一次更新;或者自己直接传xml好了
------解决思路----------------------
引用:
这样做的速度很慢,求最快最方便的将订单数据写入到数据库的方法。


所谓“方便”,没有绝对的方便,你可能觉得“不写代码才最方便”。但是既然已经写完毕了,那么你何必要修改呢?整天纠结已经写完毕、运行得很好的代码,才是最“不方便”的行为。

如果是从“容易调试修改”的角度,那么使用强类型的.net业务实体对象(而不是JObjec、JArray)这可以保证代码比较清晰、易诊断问题。这就不是简单地图方便,而是考虑到修改维护的真正方便。

至于说“速度慢”,我不知道有多慢?!这或许只是个借口吧。

我不知道你是不是觉得写一条sql语句就不“方便了”。如果你不直接写sql语句然后在循环中重复使用,而是弄个什么datatable之类的,那可能是自找麻烦的。
------解决思路----------------------
引用:
我现在追求速度,容易调试和修改在其次。我要对接N多微商城,现在对接了十几个,每次同步的数据2万条左右,用我帖子里的做法,每次同步的时间3分钟左右。如果对接的店铺越来越多,这个速度就太慢了。


你是否测试过,是把时间主要花在从 JArray 中读取数据或者是写个 Insert 或者 Update 语句上吗?
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

我现在追求速度,容易调试和修改在其次。我要对接N多微商城,现在对接了十几个,每次同步的数据2万条左右,用我帖子里的做法,每次同步的时间3分钟左右。如果对接的店铺越来越多,这个速度就太慢了。


你是否测试过,是把时间主要花在从 JArray 中读取数据或者是写个 Insert 或者 Update 语句上吗?


往数据库写数据花了90%以上的时间。


解析一条就插一条,数据库又是open又是close的,当然慢了~~
解析这个步骤,肯定花费不了多少时间的,因为json本身就比xml要轻量,传输的数据量小很多。而且json是格式化的,容易解析。
瓶颈在IO而不是运算。
可以考虑解析到Array/List,然后定义数据库事务操作,通过事务进行批量更新。
或者弄到一个强类型dataset中,使用自动生成的代码和方法进行更新(目测原理也是一条记录就一开一关的,所以要稍作修改,在更新前先手动open,更新完毕后再close,这样会跳过一开一关)。
------解决思路----------------------
用StopWatch计算下,瓶颈在哪,是解析速度慢,还是插入数据库慢

批量插入或更新数据,SQL2008中有表值变量,用这个会快很多
------解决思路----------------------
http://blog.csdn.net/kissdeath/article/details/18710885
json转换为DataTable操作方法,再将datatable更新到数据库中,
------解决思路----------------------
批量插入
1.根据数据拼接sql,与数据库只交互一次
2.将json想办法转成datatable,用SqlBulkCopy  (oracle用OracleBulkCopy,OracleBulkCopy不支持事务)
    具体代码如下
              
  SqlTransaction sqlTran = sqlConn.BeginTransaction();
  SqlBulkCopy sbc = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.Default, sqlTran);
  sbc.BulkCopyTimeout = 3600;
  sbc.BatchSize = 50000; //一次更新的行数
   foreach (DataColumn col in dtLog.Columns)
   {
           sbc.ColumnMappings.Add(col.ColumnName, col.ColumnName);
    }
   sbc.DestinationTableName = "\"" + this.SysParameter.DataBaseNodeCode + "\".tbDataCheckLog";
   sbc.WriteToServer(dtLog);
  相关解决方案