1.企业应用架构模式
- 架构
- 架构的定义:最高层次的系统分解、系统中不容易改变的部分。
- 架构中最有价值的部分是:分层设计。
- 企业应用的特点
- 一般都涉及持久化数据
- 一般都涉及大量数据
- 一般还涉及很多人同时访问系统
- 还涉及大量操作数据的用户界面屏幕
- 通常还与企业周围的其他企业应用集成
- 还存在数据的概念不一致性
- 复杂的业务”无逻辑“
- 系统庞大,须具有”分而治之“的思想
- 企业应用的种类(抽象、提炼)
- 处理大量数据的系统
- 用户界面高要求的系统
- 数据管理系统
- 关于性能的考虑
- 响应时间
- 响应性:进度条
- 等待时间
- 吞吐率
- 负载
- 效率
- 可伸缩性
- 模式
- 模式最主要的是”意图“和”概要”
- 所有的模式都是行为方式的抽象概念,都是不完备的,需要不断学习完善。
2.分层
- 专业的人做专业的事情
- 分层的好处
- 可以将某一层当初一个有机整体来理解
- 可以替换某层的内部实现,只要提供的服务相同即可
- 可以降低耦合性,把各个层次的依赖性减到最低
- 分层有利于标准化工作
- 企业应用层次的演化
- 三个基本层次:表现层、领域层、数据源层
3.组织业务逻辑
- 业务逻辑的模式
- 三种模式:事务脚本、业务模型、表模块。
- 事务脚本:一个过程控制一个动作的逻辑。
- 业务模型:每个对象都承担一部分相关的逻辑 。
- 表模块:以表为单位设计的模式。
- 将处理业务逻辑分为业务层、服务层
- 服务层:放置事务控制和安全校验,提供一个易于使用的API。
4.映射到关系数据库
- 架构模式
- 主要时解决驱动领域逻辑访问数据库的方式
- 把领域模型和数据库完全独立,让间接层完成领域对象和数据库表之间的映射
- 行为问题
- 行为时从数据库读取数据以及修改数据的动作
- 需要保证数据的一致性
- 延迟加载也是必要的思想,延迟加载主要是拥有一个对象引用的占位符
- 读取数据
- 读取数据的方法可以看作一个查找器
- 读取数据关键的问题是性能问题
- 读取数据的准则是尽量进行批量操作,避免重复查询相同的表
- 结构映射模式
- 关系的映射:对象和键的映射
- 依赖映射可以简化映射关系
- 继承
- 单表继承:所有类建立一个表
- 具体表继承:每个具体类建立一个表
- 类表继承:一个层次的每个类建立一个表
- 建立映射
- 两步映射:先把内存方案转换为逻辑数据存储方案,然后从逻辑数据存储到物理数据存储
- 使用元数据
- 元数据映射:数据库中的列映射到对象的域。
- 数据库链接
- 数据库链接建立开销很大,因此需要建立一个连接池
- 一个事务必须保证每个命令都是同一个链接发出
- 链接使用完后需要关闭,一般是用垃圾回收机制关闭链接
- 避免使用select* ,使用预编译机制避免sql注入。
5.Web表现层
- web服务器应用程序
- 使用脚本:接受HTTP请求数据,通过写出stream形式输出这个字符串
- 服务器页面:程序和返回的文本页组合在一起
- 把非表现层逻辑剥离出来
- 视图模式
- 转换视图、模板视图和两步视图
- 转换视图:程序的一种转换风格
- 模板视图:网页结构中编写表现层,页面中嵌入标签。不过这样会导致代码混乱难以维护。
- 两步视图:可以理解为前后端分离,两者独立业务逻辑更清晰,但是在性能方面有一定的损耗。
- 输入控制器模式
- 一个页面准备一个控制器
- 控制器分离出单独的对象,一个动作对应一个页面。
6.并发
- 并发问题
- 开发者能简单的避开并发问题是因为有了事务管理程序。
- 离线并发:多数据库事务中数据操作的并发控制。
- 更新丢失:A先更新数据1,然后B更新数据1,而B在A之前更新完数据。那么会导致B更新的数据就会丢失,因为B在A开始之后开始,却在A结束之前结束,导致A没有读到B的更新。
- 不一致读:A读数据过程中,B修改了数据,导致A读取的不是最新的数据。
- 执行语境
- 请求:应对软件工作的外部环境发出的单个调用。
- 会话:客户端和服务端长时间的交互
- 事务:多个请求看作是单个请求
- 隔离与不变性
- 对数据加锁
- 识别不变的数据
- 乐观并发控制和悲观并发控制
- 乐观锁:冲突检测,适用场景是冲突少且冲突结果不严重。
- 悲观锁:冲突避免,减少并发程度,但是会产生大量阻塞影响性能。
- 避免不一致读
- 悲观锁策略是读数据加一个读锁(共享锁),写数据加一个写锁(排他锁)。
- 乐观锁策略是将冲突检测建立在数据的某种版本标记上。
- 死锁
- 悲观锁技术有一个特别的问题就是死锁。
- 死锁:A对数据1加了锁,B对数据2加了锁,如果后面A要用到数据2,B要用到数据1。因为B对数据2加了锁,A就会等待B执行完,而B获取数据1也需要等待A执行完。这样A和B之间就出现了死锁。
- 处理死锁的一个方法是超时控制和检测机制。
- 尽量避免死锁才是最有效的解决方案:一开始获取所有锁,或者按照相同的顺序获取锁。
- 事务
- ACID:原子性、一致性、隔离性、持久性。
- 长事务:跨越多个请求的事务称做长事务。
- 延迟事务:尽可能晚的打开事务,可以减少事务执行时间,但是可能会导致不一致读。
- 锁升级:如果一个事务锁住了多行数据,数据库无法处理那么多锁,就会升级为表锁。
- 减少事务隔离:可串行化的、可重复读、读已提交、读未提交。
- 可串行化:完全隔离,所有事务时串行化执行的。
- 可重复读:允许幻读,幻读就是A向一个集合中加入一批元素,而B只读到其中一部分数据。通常是插入数据引起的。
- 读已提交:重新读取已经提交的数据
- 读未提交:允许脏读,读取没有提交的数据,而这些数据又被回滚了,这种情况称之为脏读。
- 业务事务和系统事务
- 系统事务:通常说的数据库事务
- 业务事务:是一组业务操作,业务也期望它有ACID的属性,解决这一问题的方案是离线并发。
- 离线并发:把业务事务分成一系列的短事务。
- 业务事务最大的问题是隔离性。
- 离线并发控制的模式
- 处理离线并发问题的首选是乐观离线锁。因为它易于实现,提供最好的灵活性。
- 应用服务器并发
原文地址:https://www.cnblogs.com/wuchangliang/p/11129775.html
时间: 2024-11-08 09:26:18