1,订票系统案例,某航班只有一张机票,假定有1w个人打开你的网站来订票,问你如何解决并发问题(可扩展到任何高并发网站要考虑的并发读写问题)
问题,1w个人来访问,票没出去前要保证大家都能看到有票,不可能一个人在看到票的时候别人就不能看了。到底谁能抢到,那得看这个人的“运气”(网络快慢等)
其次考虑的问题,并发,1w个人同时点击购买,到底谁能成交?总共只有一张票。
首先我们容易想到和并发相关的几个方案 : 锁 同步
同步更多指的是应用程序的层面,多个线程进来,只能一个一个的访问,java中指的是syncrinized关键字。 锁也有2个层面,一个是java中谈到的对象锁,用于线程同步;另外一个层面是数据库的锁;如果是分布式的系统,显然只能利用数据库端的锁来实现。
假定我们采用了同步机制或者数据库物理锁机制,如何保证1w个人还能同时看到有票,显然会牺牲性能,在高并发网站中是不可取的。使用hibernate后我们提出了另外一个概念:乐观锁、悲观锁(即传统的物理锁);采用乐观锁即可解决此问题。乐观锁意思是不锁定表的情况下,利用业务的控制来解决并发问题,这样即保证数据的并发可读性又保证保存数据的排他性,保证性能的同时解决了并发带来的脏数据问题。
hibernate中如何实现乐观锁:
前提:在现有表当中增加一个冗余字段,version版本号, long类型
原理:1)只有当前版本号》=数据库表版本号,才能提交
2)提交成功后,版本号version ++
实现很简单:在ormapping增加 一属性optimistic-lock="version"即可,以下是样例片段
<hibernate-mapping>
<class name="com.insigma.stock.ABC" optimistic-lock="version" table="T_Stock" schema="STOCK">
2,股票交易系统、银行系统,大数据量你是如何考虑的
首先,股票交易系统的行情表,每几秒钟就有一个行情记录产生,一天下来就有(假定行情3秒一个) 股票数量×20×60*6 条记录,一月下来这个表记录数量多大? oracle中一张表的记录数超过100w后 查询性能就很差了,如何保证系统性能?
再比如,中国移动有上亿的用户量,表如何设计? 把所有用于存在于一个表么?
所以,大数量的系统,必须考虑表拆分-(表名字不一样,但是结构完全一样),通用的几种方式:(视情况而定)
1)按业务分,比如 手机号的表,我们可以考虑 130开头的作为一个表,131开头的另外一张表 以此类推
2)利用oracle的表拆分机制做分表
3)如果是交易系统,我们可以考虑按时间轴拆分,当日数据一个表,历史数据弄到其它表。这里历史数据的报表和查询不会影响当日交易。
当然,表拆分后我们的应用得做相应的适配。单纯的or-mapping也许就得改动了。比如部分业务得通过存储过程等
3、此外,我们还得考虑缓存
这里的缓存,指的不仅仅是hibernate,hibernate本身提供了一级二级缓存。这里的缓存独立于应用,依然是内存的读取,假如我们能减少数据库频繁的访问,那对系统肯定大大有利的。比如一个电子商务系统的商品搜索,如果某个关键字的商品经常被搜,那就可以考虑这部分商品列表存放到缓存(内存中去),这样不用每次访问数据库,性能大大增加。
简单的缓存大家可以理解为自己做一个hashmap,把常访问的数据做一个key,value是第一次从数据库搜索出来的值,下次访问就可以从map里读取,而不读数据库;专业些的目前有独立的缓存框架 比如memcached 等,可独立部署成一个缓存服务器。
分享到:
相关推荐
它们能有效处理大规模数据,并支持水平扩展,满足不断增长的数据量需求。 此外,搜索引擎还需要支持实时索引和搜索,这通常涉及到流式计算框架,如Apache Storm或Spark Streaming。这些工具能够实时处理数据流,...
6. **权限控制与安全**:考虑到教务管理系统涉及敏感信息,系统可能包含了用户角色、权限分配等功能,以确保数据的安全。 7. **异常处理**:通过使用try-catch语句来捕获和处理运行时可能出现的错误,确保系统的...
在数据库设计上,**分表分库**是解决大数据量问题的有效手段。通过对数据进行水平或垂直切分,可以分散负载,提升处理能力。例如,可以按商品ID的哈希值进行分区,使得每个分区的压力相对均衡。 还要关注的是**事务...
Nginx以其高性能和低内存占用著称,适合高并发场景;而Apache支持多种模块,适合复杂的应用环境。根据需求,可以选择单个服务器或采用反向代理配置,将请求分发到多个后端服务。 2. **动态语言运行环境**:对于编程...
- **安全性测试**:确保系统能够抵御恶意攻击,保护数据安全。 #### 正交表测试用例设计方法特点 正交表测试用例设计方法是一种通过构建正交实验设计表来简化测试案例数量的方法,适用于输入参数较多的情况。这种...
3. JMeter:Apache项目,主要用于性能测试,可以模拟大量并发用户,检测系统负载和稳定性。 4. Postman:API测试工具,方便开发者进行接口测试和调试。 5. SonarQube:静态代码分析工具,帮助找出源码中的潜在问题...
- **大数据量性能测试**:测试系统在处理大量数据时的表现,评估其扩展能力和数据处理效率。 - **网络性能测试**:评估在网络延迟、丢包等条件下系统的性能表现。 - **服务器性能测试**:专门针对服务器硬件和软件...
高性能的游戏服务器需要考虑许多优化因素,如缓存策略、负载均衡等。源代码可能会揭示如何在资源有限的Web环境中最大化游戏性能。 9. **社区与互动** Ogame的成功在于玩家间的互动。通过代码,我们可以看到聊天...
在C++编程中,多线程技术是一种强大的工具,它允许程序同时执行多个任务,从而提高了效率和响应性。本文将深入探讨C++中的多线程,并解释如何创建...通过熟练掌握这些概念和实践,你可以编写出更加灵活和高性能的软件。
C语言以其接近硬件的操作能力和灵活性闻名,广泛应用于系统软件开发、嵌入式开发、高性能计算以及各种应用软件的开发。C语言的编程基础涉及数据类型、控制结构、函数、指针等核心概念,而高级编程则涵盖更复杂的话题...
你在具体案例中的应用是否也是在延伸 J2EE 的思 想? 如果你不能很好的延伸 J2EE 的思想,那你岂非是大炮轰蚊子,认识到 J2EE 不是适合所有场合的人至少是明智的,但我们更 需要将 J2EE 用对地方,那么只有理解 ...