json 数据写入mysql数据库中_高分求json数据快速写入数据库的方法

本文讨论了从JSON格式的订单数据批量导入数据库的方法,对比了不同技术手段的效率,并提出了解决方案,旨在提高数据处理速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.youkuaiyun.com/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数据快速写入数据库的方法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值