- 浏览: 495602 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1028)
- [发布至博客园首页] (826)
- [随笔分类]个人生活随笔 (14)
- [网站分类]首页候选区 (26)
- [网站分类]SharePoint (15)
- [网站分类]其他技术区 (6)
- [随笔分类]批处理技巧 (6)
- [随笔分类].net 2.0 (3)
- [随笔分类]SharePoint2007(MOSS2007) (0)
- [网站分类].NET新手区 (6)
- [网站分类]ASP.NET (6)
- [网站分类]架构设计 (18)
- [网站分类]程序人生 (2)
- [网站分类]SQL Server (2)
- WCF (3)
- 编程技巧 (2)
- 模式架构 (2)
- 分析设计 (4)
- 生活随笔 (0)
- 软件工程 (1)
- Android实例 (2)
最新评论
-
zilong0536:
楼主您好:
请问发表博文支持图片的功能怎么实现啊,一直没有思路 ...
新浪微博开放平台开发-android客户端(3) -
nicegege:
小弟 学习了
帮助中国移动设计10086的排队小模块 -
zl7824516:
用什么技术没说啊
通告(公告),消息(站内短信),提醒的设计:通告 -
virusswb:
源码下载: SinaWeibo2 源码下载之后,将后缀改为ra ...
新浪微博开放平台开发-android客户端(3) -
Jimmyxu0311:
找不到源码下载
新浪微博开放平台开发-android客户端(3)
数据访问层简介
上图的深黑色框中的就是数据访问层,通常包括下面的部分:
数据访问组件。这些组件抽象了对于存储在数据库的内容的访问。将常用的数据访问集中化,是的应用很容易配置和维护。一些数据访问框架,还允许开发者在helper和数据访问组件的基础上实现自定义的访问组件。其他的数据访问组件,例如ORM框架,自动实现了数据访问组件,减少了开发者需要编写的数据访问代码。
服务代理。如果业务逻辑需要访问一个来自其他服务提供的数据,需要为特殊的服务实现一些代理访问的代码。服务代理需要开发者实现对于服务的访问,还需要缓存,离线支持,基本的数据映射(应用可用的数据格式与服务提供的数据格式之间映射)。
通常的设计考虑
你的数据访问层一定要满足应用的需要,高效的、安全的运行,如果逻辑层变化的话,很容易维护和扩展。在设计的时候,可以参考下面的原则:
-
选择适当的数据访问技术。数据访问技术的选择依赖于你处理的数据类型,在应用中如何操作数据。特定的数据访问方案更加适合特定的方案。
-
使用抽象实现松散耦合的数据访问层接口。通过定义接口组件来实现,就好像网关的输入和输出,将请求翻译成一个可以被组件理解的格式。另外,你可以使用接口类型或者是抽象类型定义共享的接口。
-
在数据访问层封装数据访问功能。数据访问层应该隐藏对数据存储的访问细节。负责管理链接,生成查询,将实体映射为数据存储的类型。数据访问层的消费者,应该使用数据实体和数据访问层进行交互,不应该知道内部的实现细节。分离关注,有利于应用开发和维护。
-
决定如何从实体映射到数据源的结构。通常使用Domain Model或者是Table Module模式,或者使用ORM框架。
-
考虑使用巩固的数据结构。如果你通过服务暴露数据,考虑使用DTO帮助你统一数据格式。另外,DTO鼓励粗粒度的操作,提供一个可以在不同的边界之间传递数据的结构。如果你使用Table Data Gateway 或者是Active Record模式,可以考虑使用DataTable来代表数据。
-
决定如何管理链接。数据访问层应该创建和管理所有的数据访问连接。一定要选择一个合适的方法存储和保护连接信息,可以通过加密配置节的链接信息。
-
决定你如何处理数据异常。数据访问层应该捕获和处理和数据源以及CRUD(Create,Read,Update,Delete)操作的异常。异常集中在数据本身,对数据源的访问,访问超时,应该在本层处理,如果异常影响到应用的功能,需要向上层传递。
-
考虑安全风险。数据访问层保护数据,防止攻击,试图获取或者是破坏数据。例如:审查错误和异常信息,不要将这些信息暴露,使用最小级别的账户限制获取更多的信息。在数据源和数据访问层都要显示账户的权限。通过参数化查询条件,防止SQL注入攻击,不要使用用户出入的内容进行字符串拼接。
-
减少数据库的往复。考虑在一次数据库查询中批量执行命令,减少和数据库的往复。
-
考虑对象的性能和伸缩性。在设计的时候就要考虑对象的伸缩性和性能。例如:如果是跨越internet的应用,数据访问层很可能就是应用的瓶颈。如果数据访问性能很关键,优化数据访问,减少数据操作带来的性能消耗。
特殊的设计问题
在设计数据访问层的时候,通常有下面的问题需要面对:
-
批量的问题
-
大型的二进制对象
-
连接
-
数据格式
-
异常管理
-
对象关系映射
-
查询
-
存储过程
-
存储过程 还是 动态SQL语句
-
事务
-
验证
-
XML
1 批量的问题
批量执行数据库命令可以提高数据访问层的性能。每一次数据库执行,都会引来性能的消耗。通过增加吞度量和减少延迟,批量处理可以减少总的消耗。一些相似的命令批量执行可以提高性能,因为数据库缓存,重用一个相似查询的执行计划。在设计批量的时候可以参考下面的原则:
-
使用批量减少数据库往复和网络通信量。但是,批量类似的查询才可以获得最大的性能提高。批量不相似的、或者是随机的查询,和批量类似的查询,不提供相同级别的性能提高。
-
考虑用批量命令和DataReader获取数据。如果要从文件中加载大量数据到数据库,考虑使用BCP(Bulk Copy Utilities)。
-
在需要长时间运行的批量命令中不要使用事务, 会锁定数据库资源。
2 大型的二进制对象
当数据的存储和获取以单一的流为单位的时候,考虑使用大型的二进制对象,BLOB(Binary Large Object),数据的结构对于数据库是不可见的,数据访问层也只是读取和写入这个数据。在数据库直接存放他们,或者存储一个指向他们的指针,通常不直接存储在数据库,而是存放在文件系统。通常用来存储图片数据,或者是存储对象的二进制形式,可以参考下面的原则:
考虑是否要将BLOB存储在数据库。现在的数据库对于处理BLOB更加好了,提供你可以选择的适当的列类型,提供可维护性,版本,操作和相关的元数据。但是要考虑存储在硬盘上是否更合适,在数据库只是存储一个地址。
考虑使用BLOB简化大型的二进制数据在服务器之间的同步。
考虑对于BLOB是否需要搜索。如果需要的话,建立其他的列用来查询,而不是查询二进制数据本身。
什么时候需要获取BLOB数据,在业务层或者是表现层将它转换为适当的类型。
3 连接
连接是数据访问层的一个基础部分,所有的数据源访问连接都应该在数据访问层管理。为了最大化性能和安全,可以参考下面的原则:
-
通常来说,打开的链接应该尽早的关闭。不要长期的将连接处于打开状态。
-
无论什么时候,都通过一个连接进行事务的操作。
-
使用连接池。
-
处于安全原因。避免使用系统或者是User Data Source Name(DSN)存储连接信息。
-
考虑在连接丢失或者超时的时候,是否设计提供冲重新尝试的功能。
4 数据格式
和其他应用进行交互的时候,选择适当的数据格式,跨进程和物理机器的时候使用序列化。可以参考下面的设计原则:
-
在和其他系统或者平台进行交互的时候,考虑使用xml格式的数据。
-
在简单的CRUD为基础的应用中,考虑使用离线方案的DataSets。
-
如果你一定要跨物理边界传输数据,考虑序列化。例如:考虑如何序列化自定义的业务对象,在需要的时候如何将他们翻译成DTO,接受数据的层可以理解什么格式的数据。
5 异常管理
设计一个集中的异常管理策略,方便在数据访问层保持一致的异常捕获和抛出。如果有可能的话,将异常处理组件化,实现跨层的关注。特别关注一下异常在可信边界与其他层之间的传递。为不能处理的异常进行设计,以便不会导致系统的可用性问题,不会暴露系统的敏感信息。参考下面的设计原则:
-
确定应该在数据访问层捕获和处理的异常。例如:死锁和连接问题应该在数据访问层处理。但是,一些并发的问题,应该让用户来决定。
-
设计一个适当的异常传播策略。例如:允许异常传播到可以记录的层。
-
考虑实现一个在发生异常的时候,可以重新尝试的功能。
-
设计记录异常信息的发生,同时不暴露敏感信息,方便查找系统的错误。
6 对象关系映射
在设计面向对象应用的时候,考虑阻止OO模型和关系模型之间的不匹配,考虑他们之间转换的难点。例如:OO设计中的封装,隐藏字段的地方,和数据库的开放的天性不匹配。还有就是数据类型的不一致,结构不一致,处理不同,数据操作也不一致。有两个常用的办法来处理这类问题,一个是Repository模式,一个是ORM工具。Domain Driven Design领域驱动的设计方法,一个以领域对象为实体类,经常是一个合适的选择。可以参考下面的设计原则:
-
考虑使用提供实体和数据库之间的ORM的框架,现在的ORM框架可以帮助减少大量需要编写的代码。
-
如果你工作在一个全新的开发环境,对数据库有完全的控制,你可以用ORM工具生成对象模型对应的数据库结构,提供对象模型和数据库之间的映射。
-
如果你工作在一个正在运行的环境,已经存在一个数据库结构,你也可以用ORM工具生成对应的对象模型。
-
如果你工作在一个小应用,或者是没有权限使用ORM工具,实现一个常用的数据访问模型,例如:Repository。
-
当开发web应用和web service的时候,考虑使用延迟加载。允许应用优先处理优先级高的用户请求。
未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
发表评论
-
NET 应用架构指导 V2 学习笔记(十六) 服务层设计指导
2010-06-04 00:13 547如果你的应用是通 ... -
NET 应用架构指导 V2 学习笔记(十七) 组件设计指导
2010-06-05 00:48 669组件提供了一种将 ... -
NET 应用架构指导 V2 学习笔记(十八) 表现层组件设计指导
2010-06-05 21:09 528本章讲述的是你在设计用户界面组件和表现层逻辑组件的时候应该 ... -
NET 应用架构指导 V2 学习笔记(十九) 表现层组件设计指导
2010-06-06 06:15 5915 决定数据绑定的 ... -
NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
2010-06-07 06:58 614前言 业务组件 ... -
微软企业库5.0学习笔记(四十二)异常处理模块
2010-06-14 00:04 835企业库的异常处理 ... -
关于程序员在30岁、35岁之后怎么办的新思考
2010-06-14 10:40 624首先给大家问个好 ... -
NET 应用架构指导 V2 学习笔记(二十四) 跨层关注问题
2010-06-17 20:00 594概况 大部分的 ... -
微软企业库5.0学习笔记(四十三)数据验证模块
2010-06-19 08:07 996概况 任何接受用户或者是其他系统输入的应用,一定要确保 ... -
关于项目进度慢的思考----如何提高整体开发效率
2010-06-21 23:42 803我们都是软件行业 ... -
微软企业库5.0学习笔记(四十四)实战数据验证模块
2010-06-23 19:22 8401 在业务对象上添加验证 添加对程序集【Microso ... -
微软企业库5.0学习笔记(四十五)实战数据验证模块----高级篇
2010-06-24 19:41 9691、添加自定义的提示信息 验证失败的提示信息可以自定义 ... -
面向对象类设计的五大原则(一)单一职责原则Single Responsibility Principle
2010-06-29 15:45 777引言 面向对象类设计,或者说是面向对象设计,有五大原则 ... -
《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)
2010-07-01 06:42 650oreilly的《Head.First ... -
《深入浅出设计模式-中文版》读书笔记-继承与组合(三)
2010-07-03 16:53 605经过上一次的改造 ... -
《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
2010-07-06 06:34 633今天要接触的是观 ... -
利用attribute实现简单的ORM
2010-07-09 15:27 682我不知道NH的ORM具 ... -
系统内部模块(子系统)之间的耦合以及模块(子系统)划分
2010-07-14 13:02 807题外话 最近已经在努力学习了,学习基本功,学习设计模式 ... -
《深入浅出设计模式-中文版》读书笔记-工厂模式(五)
2010-07-16 12:46 699今天给大家带来的是:工厂模式。 我们在代码中创建一个对 ... -
Head.First.Object-Oriented.Design.and.Analysis《深入浅出面向对象的分析与设计》读书笔记(一)
2010-07-18 21:47 671题外话 又是一本Head.First系列的书,这个系列 ...
相关推荐
"牛【SystemVerilog】路科验证V2学习笔记(全600页)"是一份详尽的学习资料,涵盖了路科验证方法论的第二版(V2)在SystemVerilog中的应用。 笔记内容可能包含了以下几个关键知识点: 1. **基础语法**:...
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 ...
"大型金融数据中心网络架构设计V2.pptx" 本资源摘要信息来自一个关于大型金融数据中心网络架构设计的PPT文件,内容涵盖了金融数据中心网络架构设计的演进路线、金融网络应用场景的划分、数据中心应用服务域、双活...
SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注。 目录如下: 第一章 SV环境构建常识 1 1.1 数据类型 1 四、二值逻辑 4 定宽数组 9 foreach 13 动态数组 16 队列 19 关联数组 21 ...
TCSAE(中国汽车工程学会)发布的《合作式智能运输系统 车用通信系统应用层及应用数据交互标准》(TCSAE 53-2017)是中国在V2X领域内首项正式标准,标志着国内相关技术的规范化发展。 该标准TCSAE 53-2017旨在提升...
在“AADL学习笔记.docx”文档中,读者可以期待找到对这些概念的详细解释、实例演示以及如何将它们应用到实际项目中的指导。这份笔记对于正在学习AADL或准备采用AADL进行系统设计的人来说是一份宝贵的资源。
SystemVerilog路科验证V2是一个SystemVerilog的听课学习笔记,包括讲义截取、知识点记录、注意事项等细节的标注,可快速获取自已需要的知识,喜欢的平台可下载试试! 介绍设计描述和验证语言SystemVerilog的基本...
分层架构是一种常见的设计模式,将应用分为表示层、业务逻辑层和数据访问层。这种结构有助于保持各层之间的职责分离,增强系统的可测试性和可维护性。《指南》中详细解释了每层的功能及其相互关系,帮助开发者理解...
- 编写代码以访问Kinect V2的传感器数据,包括深度数据、红外数据和彩色图像数据。 - 学习如何处理和分析从Kinect V2获取的传感器数据。 - 掌握如何构建交互式应用程序,这些程序可以利用Kinect V2的运动捕捉功能。 ...
大数据平台的总体技术框架通常由五个层次构成:数据源层、数据接口层、平台架构层、分析工具层和业务应用层。数据源层汇集来自各个业务系统、服务系统及外部单位的结构化和非结构化数据;数据接口层负责不同数据类型...
NoSQL数据库技术是近年来在大数据处理领域中备受关注的一种存储和查询非结构化及半结构化数据的方法。...通过理解并掌握JUST的架构与应用实践,开发者和数据科学家可以更好地利用时空数据服务于智慧城市的建设。
本文将深入探讨“路科验证V2”学习笔记中的关键知识点,主要基于提供的"SV部分讲义"。 一、SystemVerilog基础 1. **数据类型**:SystemVerilog提供了丰富的数据类型,包括位(bit)、逻辑(logic)、整型(int)、...
通过以上知识点的梳理,可以看出LSD-TEST430F5438-01_V2_1学习板实验指导书覆盖了从硬件资源介绍到软件编程实践的全面内容,旨在帮助学习者深入理解MSP430F5438单片机的各项特性和实际应用,是一份非常实用的学习...
机器人视觉抓取数据集Jacquard V2是一个广泛用于机器人学习和计算机视觉研究的重要资源,尤其在物体识别、抓取规划以及深度学习算法的训练中起到关键作用。这个数据集包含了大量的图像和相应的标注信息,旨在帮助...
"V2X应用层协议标准(day2)asn1.rar"这个压缩包文件提供了V2X应用层ASN.1(Abstract Syntax Notation One)编码文件,这是一个国际标准,用于定义数据结构和编码规则。 ASN.1是一种强大的数据表示语言,常用于通信...
微服务和Serverless是当前云计算架构设计中非常热门的概念,它们在解决传统单体应用所面临的可伸缩性、运维复杂性和快速迭代等问题上表现出了明显优势。在王晓波所著的《从微服务到Serverless+架构应用与实践》这份...
"架构革新,高效可控百度数据平台的最新发展趋势V2"这一主题揭示了百度如何在大数据处理、云计算、人工智能等领域持续创新,以应对日益复杂的业务需求。 首先,架构革新是提升数据平台性能的关键。传统的数据处理...
旷视科技提出的ShuffleNet V2是一种针对移动端深度学习应用优化的卷积神经网络架构。这种新型架构的提出,旨在解决移动端深度学习领域中计算资源受限和对速度效率需求较高的问题。ShuffleNet V2的设计思想来源于对于...
中兴物联ME3760_V2公网模块是一种无线通信模块,主要技术参数和机械特性、接口电气特性、射频性能指标等方面进行详细介绍,并提供了模块调试环境的搭建方法和硬件快速上手指导。该文档作为硬件用户指导手册,其内容...
【C# OA 三层架构示例代码】是一个用于展示企业级应用中常见设计模式的代码库,主要关注C#编程语言在开发办公自动化(Office Automation,简称OA)系统时采用的分层架构。这种架构模式通常包括表现层(Presentation ...