代码改变世界

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数据,建立索引。

 

  未完待续。。。。。。。。。。。。。。。。。。。。。。。。