Code Bye

高分求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,逐条写入订单明细表。
这样做的速度很慢,求最快最方便的将订单数据写入到数据库的方法。

解决方案

5

只能批量插入。
先解析SQL转成dataset。再用SqlBulkCopy批量插入

10

先一条条解释成一个dataset,然后dataset一次更新;或本人直接传xml好了

5

引用 LZ u010349289 的回复:

这样做的速度很慢,求最快最方便的将订单数据写入到数据库的方法。

所谓“方便”,没有绝对的方便,你可能觉得“不写代码才最方便”。但是既然已经写完毕了,那么你何必要修改呢?整天纠结已经写完毕、运行得很好的代码,才是最“不方便”的行为。
假如是从“容易调试修改”的角度,那么使用强类型的.net业务实体对象(而不是JObjec、JArray)这可以保证代码比较清晰、易诊断问题。这就不是简单地图方便,而是考虑到修改维护的真正方便。
至于说“速度慢”,本人不知道有多慢?!这或许只是个借口吧。
本人不知道你是不是觉得写一条sql语句就不“方便了”。假如你不直接写sql语句然后在循环中重复使用,而是弄个什么datatable之类的,那可能是自找麻烦的。

20

引用 12 楼 u010349289 的回复:

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

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

30

引用 15 楼 u010349289 的回复:
Quote: 引用 14 楼 sp1234 的回复:
Quote: 引用 12 楼 u010349289 的回复:

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

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

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

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

20

用StopWatch计算下,瓶颈在哪,是解析速度慢,还是插入数据库
批量插入或更新数据,SQL2008中有表值变量,用这个会快很多

5

http://blog.csdn.net/kissdeath/article/details/18710885
json转换为DataTable操作方法,再将datatable更新到数据库中,

5

批量插入
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);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明高分求json数据快速写入数据库的方法