`
felly822
  • 浏览: 9568 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

大数据量并发提交

 
阅读更多

  最近遇到一个场景:

   1、系统有一个功能是做入库,批量挺大,一次需要入库上万级的数据(页面一个提交完成)。

   2、系统使用的B/S结构。

   3、系统表数据已经很庞大,估计上千万级数据了。

   4、系统架构主要是Action--->Service 结构,也就是Action用于处理页面的跳转,Service层用于具体的业务处理,

Action和service是1对多的关系,其中一个service层方法作为一个事务。

   5、系统同时使用一个功能,一组数据的情况比较少。

 

   用户的一种操作是这样的,在页面上提交数据,但是发现一段时间没执行出来,于是重新进入系统重新保存,导致系统几乎同时出现一模一样的两个事务处理,并都执行成功,结果数据重复。

   另外一种是多个用户同时操作同一批设备,同时做入库。

 

    我们都知道事务具有,1、一致性,2、原子性,3、隔离性,4、持久性。根据其特点,结合系统的架构我们不难分析出出现问题的原因。A事务在执行,还没提交之前,B事务继续提交,此时两个事务是相互隔离的,并且两个事务的最终提交时间也具有不确定性。

      出现以上情况,大概总结了几种解决方案。

 

 

   1、对于处于同一个会话的两次提交,可以使用token机制来判断是否是同时两次提交。strtus有实现,

 

protected String generateToken(HttpServletRequest request) 创建一个令牌.
protected boolean isTokenValid(HttpServletRequest request) 检查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Boolean reset) 检查令牌是否有效,并且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request) 重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌

基本原理

服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

2、对于不同会话之间的重复提交。 这边也有几种解决方案,各有利弊:

   (1) 数据分步提交,即执行比如1000个数据后,提交事务。这样根据两个事务具有时间差 来判断数据的重复性是可行的。 但是一旦其中一个提交发生了异常中断,那么已经建档的数据得不到有效回滚操作。导致部分数据会重复提交。目前这边主要的解决办法是判断异常,然后处理数据回滚。

  (2)数据不分步提交,数据全部一次提交,两个事务具有时间差 来判断数据的重复性是理论上也是可行的。但是如果数据量太大,事务数据量太大,最终会前台session超时500错误,用户也是等不起这个执行时间的。但是对于小批量的效果很好,也不用考虑并发提交的异常情况。

   (3)从数据库的表结构上进行优化,比如表中有唯一键业务字段,那么建立唯一键。但是很多场景其实都不具备这个条件,因为大部分这个情况都是新数据的录入。

 

3、其他方面做优化,让用户等得住。

    对于长时间的处理的时候,如果只是单纯的滚动条,或者按钮灰掉等处理,用户肯定不耐烦,这边也提出几个解决办法供探讨。

   (1) 将后台执行数据在前台实时显示,同时屏蔽其他可操作入口。

   (2) 前台提供进度条,显示进度百分比,同时屏蔽其他可操作入口

  等待完成后恢复可操作入口。

  以下是实现实时展示后台执行数据的思路:

    将执行某一个元操作后的数据保存到成员变量中,然后前台页面提供一个隐藏页面轮询该变量值,并将改值返回给前台模态窗口。

 

 

 

 

 

 

 

 

 

1
1
分享到:
评论

相关推荐

    C#、.Net平台大批量提交数据到数据库

    C#、.Net平台大批量提交数据到数据库/支持多线程并发提交/支持批量提交和单条提交,内含完整源码,解压即可正常编译

    论文研究-虚拟样机协同设计并发控制策略研究.pdf

    针对虚拟样机协同设计中数据量大、事务长、多层嵌套的问题 ,提出了一种基于事务语义的并发控制策略,阐述了并发控制机制中事务结构、事务提交、锁机制和冲突协调等关键性问题。根据数据要求生成复制事务,事务发生改变...

    基于Java的在线考试系统,优秀毕业设计,小白必看!

    在Exam++考试系统第一版的基础上,我们对ExamStack V2.0进行了大量代码重构,同时也对数据模型做了部分调整。为了减小学员考试交卷时大量并发带来的系统风险,我们尝试采用成熟的消息队列框架RabbitMQ来解决这一问题...

    实时协同设计并发控制机制研究 (2005年)

    为了解决协同设计中数据量大、事务长、多层嵌套的问题,建立了一种新的协同设计并发控制模型。根据数据要求生成复制事务,事务发生改变后,其他站点能够实时显示图形、实时读取数据。通过计算数据传输的最小延时确定...

    SQL Server数据库查询速度慢原因及优化方法

     6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)  7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)  8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。  9、返回了不必要...

    自整理! 最全mysql笔记

    - 如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果 - 如果只有INSERT和SELECT操作,可以选择Archive,...

    网上招聘系统客户端系统测试报告.doc

    该文档定义了客户端系统测试的结果,总结了测试客户端的职位查询、网上提交简历、在线答题的基本功能,以及支持大数据量并发访问的性能,给出了测试的结论。 1.3缩写说明 HR Human Resource(人力资源管理)的缩写...

    a svn stat tool written by Go.(基于svn的每人代码提交情况统计工具).zip

    并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理...

    基于 Springboot + Redis + Kafka 的秒杀系统,乐观锁 + 缓存 + 限流 + 异步

    一致性:秒杀商品减库存的实现方式同样关键,有限数量的商品在同一时刻被很多倍的请求同时来减库存,在大并发更新的过程中都要保证数据的准确性。 高可用:秒杀时会在一瞬间涌入大量的流量,为了避免系统宕机,保证...

    基于GO语言大型企业级电商秒杀系统实战教程

    秒杀系统特点就是并发量极大,但实际秒杀成功的请求数量确很少,所以如果不在前端拦截可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时,甚至导致系统崩溃充分利用缓存:利用缓存可以极大提高系统读写速度消息...

    Mysql知识详解(内容非常丰富)

    Memory:全表锁,存储在内容中,速度快,但会占用和数据量成正比的内存空间且数据在mysql重启时会丢失,默认使用HASH索引,检索效率非常高,但不适用于精确查找,主要用于那些内容变化不频繁的代码表 MERGE:是一组...

    Dubbo简介.docx

    dubbo : 单一长连接和 NIO 异步通讯,适合大并发小数据量的服务调用, 以及消费者远大于提供者。传输协议 TCP,异步, Hessian 序列化; . rmi : 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象需要实现 ...

    MySQL为什么要避免大事务以及大事务解决的方法

    运行时间比较长,长时间未提交的事务就可以称为大事务 大事务产生的原因 操作的数据比较多 大量的锁竞争 事务中有其他非DB的耗时操作 。。。 大事务造成的影响 并发情况下,数据库连接池容易被撑爆 锁定太多的...

    ASP网上作业提交系统(源代码+thesis).zip

    这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程模型来处理并发请求和长时间运行的任务。这将提高应用程序的并发能力和响应性能,确保用户在高...

    大数据发展历史.pdf

    5、⼤数据从哪来 、⼤数据从哪来 1、搜索引擎服务 百度数据量1000PB,每天响应138个国家数⼗亿次请求,每⽇新增10TB 2、电⼦商务 3、社交⽹络 QQ:8.5亿⽤户,⽤4400台服务器存储⽤户产⽣的信息,压缩后的数据100PB...

    Java面试系列-MySQL

    innodb是基于B+Tree索引建立的,和myisam相反它支持事务、外键,并且通过MVCC来支持高并发,索引和数据存储在一起。 说下MySQL的索引有哪些吧? 索引在什么层面? 首先,索引是在存储引擎层实现的,而不是在服务器层...

    ASP作业提交与批改系统设计与实现(源代码+thesis).zip

    这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程模型来处理并发请求和长时间运行的任务。这将提高应用程序的并发能力和响应性能,确保用户在高...

    asp.net作业在线提交系统的设计与实现(源代码+thesis).zip

    这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程模型来处理并发请求和长时间运行的任务。这将提高应用程序的并发能力和响应性能,确保用户在高...

    ASP.NET在线毕业thesis提交系统的设计与实现(源代码+thesis).zip

    这将减少对数据库和服务器的访问次数,提高应用程序的响应速度和吞吐量。 异步编程:我们将使用ASP.NET提供的异步编程模型来处理并发请求和长时间运行的任务。这将提高应用程序的并发能力和响应性能,确保用户在高...

    seconds-kill:基于Springboot + Redis + Kafka的秒杀系统,乐观锁+缓存+限流+异步,TPS从500优化到3000

    秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键一致性:秒杀商品减库存的实现方式同样关键,有限数量的商品在同一时刻被很多倍的请求同时来减库存,在大并发更新的过程中都要保证数据的准确性。...

Global site tag (gtag.js) - Google Analytics