NET 应用架构指导 V2 学习笔记(十四) 数据访问层指导
2010-06-03 00:33 Virus-BeautyCode 阅读(2229) 评论(0) 编辑 收藏 举报查询
查询是数据访问层中主要的操作。他们是将应用的请求翻译为对数据库的CRUD行为。因为查询如此关键,应该优化它们,来最大化数据库的性能。可以参考下面的设计原则:
- 使用参数化的SQL查询,可以减少安全问题,减少SQL注入攻击。不要使用用户输入的内容进行字符串的拼接。
- 考虑使用对象创建查询。例如:实现查询对象模式,或者使用ADO.NET支持的参数化查询。考虑为查询的执行优化数据库的数据结构。
- 在动态构建SQL查询的时候,避免混入业务逻辑,使用逻辑生成SQL语句,会导致难以维护和调试。
存储过程
在过去,和动态SQL相比,存储过程代表性能的提高。但是,现在的数据库引擎,存储过程和动态的参数化的SQL执行的性能差不多。考虑使用存储过程的主要因素是,抽象,可维护性,和你的环境。出于安全和性能考虑,使用存储过程,避免在存储过程中动态拼接SQL。参数会影响对缓存的执行计划的使用,而不是重新建立一个执行计划。当参数类型和数量改变的时候,会产生新的执行计划,会降低性能。可以参考下面的设计原则:
- 使用特定类型的参数作为存储过程的输入参数,返回单个值。考虑使用xml格式传递列表。不要为了显示,而在存储过程中格式化数据。相反,返回适当的数据,在表现层进行格式化。
- 如果非要在存储过程中动态生成SQL,使用参数或者是数据库变量。但是要记住,在存储过程中动态创建SQL会影响性能、安全和可维护性。
- 避免在处理数据的时候建立临时表。但是,如果非要使用临时表,考虑将他们建立在内存中,而不是硬盘上。
- 实现适当的异常处理,给应用返回可以处理的代码。
存储过程 VS. 动态SQL
这里所说的动态SQL,指的是在代码中动态生成SQL,而不是说在存储过程中动态生成SQL。在选择两者的时候,你一定要考虑抽象的需求,可维护性,和环境的限制。另外,两者的选择还要考虑开发者的偏好和技术特点。
使用存储过程的主要优点是,对于数据库,提供了一个抽象层,当数据库改变的时候,最小化对于代码的影响。安全很容易实现和管理,因为你可以限制对存储过程的访问,使用大多数数据库都提供的安全特性可以实现细粒度的管理。
使用动态SQL的主要优点是,他们比存储过程更灵活,可以快速开发。很多ORM框架都会给你动态生成查询语句,可以减少开发的代码编写量。
选择的时候,可以参考下面的设计原则:
- 如果你的应用很小,单一的客户端,很少的业务逻辑,动态SQL通常是较好的选择。
- 如果你的应用较大,有多个客户端操作,需要考虑抽象需求。考虑使用存储过程,或者是用ORM工具提供的查询。
- 对于数据密集的操作,存储过程允许你更加贴近数据,可以提高性能。
- 如果为了在数据库改变的时候,最小化代码的改变。考虑通过存储过程访问数据库。可以将数据库的改变分离处理,可以优化存储过程。
- 考虑你的开发团队。如果团队对数据库不是很熟悉,考虑使用工具或者是和你的团队更加匹配的模式。
- 在考虑使用动态SQL的时候,你应该理解数据库的改变对代码造成的改变。你应该实现数据访问层,从业务逻辑层解耦出来,专门执行数据库查询。
- 考虑调试支持。动态SQL对开发者来说容易调试。
事务
如果事务包括的所有信息和行为都执行完毕,事务才算是完成,对数据库的改变是永久的。在数据库操作发生错误的时候,事务支持回滚,可以保持数据库数据的一致性。
确定适当的并发模型,和确定如何管理事务是非常重要的。在并发的时候,可以选择乐观锁,或者是悲观锁。乐观锁,在数据上没有锁,由代码检查更新,通常使用一个时间戳,数据从上次获取之后没有被修改。在悲观锁中,锁定数据,不能被另外一个操作更新,直到数据被解锁。
可以参考下面的设计原则:
- 考虑事务的边界,在需要的时候使用事务。在SQL Server中,每一个SQL默认就是一个事务。
- 在使用了锁的事务中,尽可能的减少执行时间。避免在需要长时间运行的事务中使用锁,避免在访问共享数据的时候使用锁。避免大量的使用锁,可能会造成死锁。
验证
设计一个有效的输入和数据验证策略,对于系统的安全性是非常关键的。需要验证从其它层或者是第三方组件提供的数据,对于从数据源获取的数据也要验证。可以参考下面的设计原则:
- 验证所有从外部调用而来的数据。确保你正确的处理了null值,过滤了非法的字符。
- 考虑验证的目的。例如:在使用用户的输入动态创建SQL的时候,应该检查字符的模式,避免发生SQL注入攻击。
- 如果验证失败,返回有用的错误信息。
XML
对于交互性和维护性来说,xml非常有用。出于性能原因,在使用xml处理大量数据的时候需要小心。参考下面的设计原则:
- 考虑使用xml reader和writer读写xml格式的数据,尤其是对于大量的xml数据。如果你需要和一个关系型的数据库交互,考虑使用支持这一功能的对象,例如ADO.NET中的DataSet。
- 考虑使用xml定义格式,为数据存储和传输提供验证。考虑为复杂的数据结构提供自定义验证,但是,要记住验证将会带来性能损失。
- 在数据库存储xml格式的数据。如果你需要查询xml数据,建立索引。
未完待续。。。。。。。。。。。。。。。。。。。。。。。。