zoukankan      html  css  js  c++  java
  • 晒晒数据访问层DAL,看看你的项目数据访问层使用的是什么形式,数据访问性能比较

    采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对未来程序维护,功能扩展起到至关重要的作用。当然良好的设计模式可以为我们提供很多的选择,但面对实际问题,公司规模小考虑成本,资金投入少,软件逻辑不算复杂,功能较少,部分客户需求只需要单个功能模块,类似小型管理系统,门户网站,crm等,这也为众多IT人事提供了兼职的好机会。借鉴类似程序,cpy下部分代码,小修小改下数据库字段新的软件就大功告成。这种现状在弊端同时也很多程序没有通过完整的测试,部分存在漏洞,维护性不高,导致客户日常投诉反工现象时有发生,弄不好还会引起不必要的麻烦,为此组件一个高效便捷的快速开发框架,集成我们日常生活中的经验是十分有必要的。

    这里我就结合几个项目中用到的简单的数据访问层简单和大家共同的学习探讨。

    1、常用数据访问我们一般采用的都有:微软自带DBHelper

    2、Enterprises Library微软企业库(Microsoft.Practices.EnterpriseLibrary.Common,Microsoft.Practices.EnterpriseLibrary.Data,Microsoft.Practices.ObjectBuilder)

    3、这里我和大家共同探讨结合微软DBHelper的自定义的加强版SqlDataProvider.cs

    数据库访问抽象类DataProvider.cs

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Data.SqlClient;
     6 using System.Configuration;
     7 using System.Data;
     8 using System.Reflection;
     9 using System.Data.OleDb;
    10 namespace DAL
    11 {
    12     ///<summary>
    13 /// 数据库访问抽象类
    14 ///</summary>
    15     public abstract class DataProvider
    16     {
    17         private static DataProvider _instance = null;
    18         public static DataProvider Instance
    19         {
    20             get
    21             {
    22                 if (_instance == null)
    23                 {
    24                     String strConnectionString = ConfigurationManager.ConnectionStrings["ConnnectionString"].ConnectionString;
    25 
    26                     String strConnectionType = ConfigurationManager.ConnectionStrings["ConnectionType"].ConnectionString;
    27                     if (strConnectionType.ToLower() == "sqlclient")
    28                     {
    29                         strConnectionType = "DAL.SqlDataProvider, DAL";
    30                     }
    31 
    32                     Type t = Type.GetType(strConnectionType);
    33                     Type[] paramTypes = new Type[1];
    34                     paramTypes[0] = typeof(String);
    35 
    36                     Object[] paramArray = new Object[1];
    37                     paramArray[0] = strConnectionString;
    38 
    39                     _instance = (DataProvider)((ConstructorInfo)t.GetConstructor(paramTypes)).Invoke(paramArray);
    40                 }
    41                 return _instance;
    42             }
    43         }
    44 
    45         #region 抽象属性和方法
    46 
    47         #region 数据库链接串
    48         public abstract String ConnectionString { get; }
    49         #endregion
    50 
    51         #region 执行SQL语句
    52         public abstract Object GetScalar(String selectSql);
    53         public abstract DataSet GetDataset(String selectSql);
    54         public virtual DataSet GetDatasetTrans(SqlTransaction trans, String selectSql) { return null; }
    55         public virtual DataSet GetDatasetTrans(OleDbTransaction trans, String selectSql) { return null; }
    56         public virtual DataSet GetDataset(String selectSql, SqlParameter[] para) { return null; }
    57         public virtual DataSet GetDataset(String selectSql, OleDbParameter[] para) { return null; }
    58         public virtual DataSet GetDatasetTrans(SqlTransaction trans, String selectSql, SqlParameter[] para) { return null; }
    59         public virtual DataSet GetDatasetTrans(OleDbTransaction trans, String selectSql, OleDbParameter[] para) { return null; }
    60         public abstract void Execute(String noneQuery);
    61         public virtual void Execute(String noneQuery, SqlParameter[] para) { }
    62         public virtual void Execute(String noneQuery, OleDbParameter[] para) { }
    63         public abstract IDataReader GetReader(String selectSql);
    64         public virtual IDataReader GetReaderTrans(SqlTransaction trans, String selectSql) { return null; }
    65         public virtual IDataReader GetReaderTrans(OleDbTransaction trans, String selectSql) { return null; }
    66         public virtual IDataReader GetReader(String selectSql, SqlParameter[] para) { return null; }
    67         public virtual IDataReader GetReader(String selectSql, OleDbParameter[] para) { return null; }
    68         public virtual IDataReader GetReaderTrans(SqlTransaction trans, String selectSql, SqlParameter[] para) { return null; }
    69         public virtual IDataReader GetReaderTrans(OleDbTransaction trans, String selectSql, OleDbParameter[] para) { return null; }
    70         #endregion
    71 
    72         #region 执行存储过程
    73         public abstract void ExecuteSp(String spName);
    74         public virtual void ExecuteSp(SqlTransaction trans, String spName) { }
    75         public virtual void ExecuteSp(OleDbTransaction trans, String spName) { }
    76         public virtual void ExecuteSp(String spName, SqlParameter[] para) { }
    77         public virtual void ExecuteSp(String spName, OleDbParameter[] para) { }
    78         public virtual void ExecuteSp(SqlTransaction trans, String spName, SqlParameter[] para) { }
    79         public virtual void ExecuteSp(OleDbTransaction trans, String spName, OleDbParameter[] para) { }
    80         public abstract IDataReader GetReaderBySp(String spName);
    81         public virtual IDataReader GetReaderBySp(String spName, SqlParameter[] para) { return null; }
    82         public virtual IDataReader GetReaderBySp(String spName, OleDbParameter[] para) { return null; }
    83         public abstract Object GetScalarBySp(String spName);
    84         public virtual Object GetScalarBySp(String spName, SqlParameter[] para) { return null; }
    85         public virtual Object GetScalarBySp(String spName, OleDbParameter[] para) { return null; }
    86         public abstract DataSet GetDatasetBySp(String spName);
    87         public virtual DataSet GetDatasetBySp(String spName, SqlParameter[] para) { return null; }
    88         public virtual DataSet GetDatasetBySp(String spName, OleDbParameter[] para) { return null; }
    89         #endregion
    90 
    91         #endregion
    92     }
    93 }
    

      


    继承类SqlDataProvider:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Data;
      6 using System.Data.SqlClient;
      7 namespace DAL
      8 {
      9     public class SqlDataProvider : DataProvider
     10     {
     11         private String _connectionString = String.Empty;
     12 
     13         public SqlDataProvider(String connString)
     14         {
     15             _connectionString = connString;
     16         }
     17 
     18         #region 实现抽象方法
     19 
     20         #region 数据库链接串
     21         public override String ConnectionString
     22         {
     23             get
     24             {
     25                 return _connectionString;
     26             }
     27         }
     28 
     29         #endregion
     30 
     31         #region 执行SQL语句
     32 
     33         ///<summary>
     34 /// 执行查询获取单值
     35 ///</summary>
     36 ///<param name="selectSql">查询语句</param>
     37 ///<returns>返回Object</returns>
     38         public override Object GetScalar(String selectSql)
     39         {
     40             return SqlHelper.ExecuteScalar(_connectionString,
     41                 CommandType.Text, selectSql);
     42         }
     43 
     44         ///<summary>
     45 /// 根据查询语句获取数据集
     46 ///</summary>
     47 ///<param name="selectSql">查询语句</param>
     48 ///<returns>返回数据集</returns>
     49         public override DataSet GetDataset(String selectSql)
     50         {
     51             if (selectSql == null) throw new ArgumentNullException("selectSql");
     52 
     53             DataSet ds = new DataSet();
     54             SqlHelper.FillDataset(_connectionString, CommandType.Text, selectSql, ds, null);
     55             return ds;
     56         }
     57 
     58         ///<summary>
     59 /// 根据查询语句获取数据集
     60 ///</summary>
     61 ///<param name="trans">事务</param>
     62 ///<param name="selectSql">查询语句</param>
     63 ///<returns>返回数据集</returns>
     64         public override DataSet GetDatasetTrans(SqlTransaction trans, String selectSql)
     65         {
     66             if (selectSql == null) throw new ArgumentNullException("selectSql");
     67 
     68             DataSet ds = new DataSet();
     69             SqlHelper.FillDataset(trans, CommandType.Text, selectSql, ds, null);
     70             return ds;
     71         }
     72 
     73         ///<summary>
     74 /// 根据带参数的查询语句获取数据集
     75 ///</summary>
     76 ///<param name="selectSql">查询语句</param>
     77 ///<param name="para">参数列表</param>
     78 ///<returns>返回数据集</returns>
     79         public override DataSet GetDataset(String selectSql, SqlParameter[] para)
     80         {
     81             if (selectSql == null) throw new ArgumentNullException("selectSql");
     82             if (para == null) throw new ArgumentNullException("para");
     83 
     84             DataSet ds = new DataSet();
     85             SqlHelper.FillDataset(_connectionString, CommandType.Text, selectSql, ds, null, para);
     86             return ds;
     87         }
     88 
     89         ///<summary>
     90 /// 根据带参数的查询语句获取数据集
     91 ///</summary>
     92 ///<param name="trans">事务</param>
     93 ///<param name="selectSql">查询语句</param>
     94 ///<param name="para">参数列表</param>
     95 ///<returns>返回数据集</returns>
     96         public override DataSet GetDatasetTrans(SqlTransaction trans, String selectSql, SqlParameter[] para)
     97         {
     98             if (selectSql == null) throw new ArgumentNullException("selectSql");
     99             if (para == null) throw new ArgumentNullException("para");
    100 
    101             DataSet ds = new DataSet();
    102             SqlHelper.FillDataset(trans, CommandType.Text, selectSql, ds, null, para);
    103             return ds;
    104         }
    105 
    106         ///<summary>
    107 /// 在某个数据库连接对象上执行查询语句获取数据集
    108 ///</summary>
    109 ///<param name="cn">数据库连接对象</param>
    110 ///<param name="selectSql">查询语句</param>
    111 ///<returns>返回数据集</returns>
    112         public static DataSet GetDataset(SqlConnection conn, String selectSql)
    113         {
    114             if (conn == null) throw new ArgumentNullException("conn");
    115             if (selectSql == null) throw new ArgumentNullException("selectSql");
    116 
    117             DataSet ds = new DataSet();
    118             SqlHelper.FillDataset(conn, CommandType.Text, selectSql, ds, null);
    119             return ds;
    120         }
    121 
    122         ///<summary>
    123 /// 执行非查询语句
    124 ///</summary>
    125 ///<param name="noneQuery">非查询sql语句</param>
    126         public override void Execute(String noneQuery)
    127         {
    128             if (noneQuery == null) throw new ArgumentNullException("noneQuery");
    129 
    130             SqlHelper.ExecuteNonQuery(_connectionString, CommandType.Text, noneQuery);
    131         }
    132 
    133         ///<summary>
    134 /// 执行非查询语句
    135 ///</summary>
    136 ///<param name="noneQuery">非查询sql语句</param>
    137 ///<param name="para">参数列表</param>
    138         public override void Execute(String noneQuery, SqlParameter[] para)
    139         {
    140             if (noneQuery == null) throw new ArgumentNullException("noneQuery");
    141             if (para == null) throw new ArgumentNullException("para");
    142 
    143             SqlHelper.ExecuteNonQuery(_connectionString, CommandType.Text, noneQuery, para);
    144         }
    145 
    146         ///<summary>
    147 /// 执行查询语句获取Reader对象
    148 ///</summary>
    149 ///<param name="selectSql">查询语句</param>
    150 ///<returns>返回DataReader</returns>
    151         public override IDataReader GetReader(String selectSql)
    152         {
    153             if (selectSql == null) throw new ArgumentNullException("selectSql");
    154 
    155             return SqlHelper.ExecuteReader(_connectionString, CommandType.Text, selectSql);
    156         }
    157 
    158         ///<summary>
    159 /// 执行查询语句获取Reader对象
    160 ///</summary>
    161 ///<param name="trans">事务</param>
    162 ///<param name="selectSql">查询语句</param>
    163 ///<returns>返回DataReader</returns>
    164         public override IDataReader GetReaderTrans(SqlTransaction trans, String selectSql)
    165         {
    166             if (selectSql == null) throw new ArgumentNullException("selectSql");
    167 
    168             return SqlHelper.ExecuteReader(trans, CommandType.Text, selectSql);
    169         }
    170 
    171         ///<summary>
    172 /// 执行查询语句获取Reader对象
    173 ///</summary>
    174 ///<param name="selectSql">查询语句</param>
    175 ///<param name="para">参数列表</param>
    176 ///<returns>返回DataReader</returns>
    177         public override IDataReader GetReader(String selectSql, SqlParameter[] para)
    178         {
    179             if (selectSql == null) throw new ArgumentNullException("selectSql");
    180             if (para == null) throw new ArgumentNullException("para");
    181 
    182             return SqlHelper.ExecuteReader(_connectionString, CommandType.Text, selectSql, para);
    183         }
    184 
    185         ///<summary>
    186 /// 执行查询语句获取Reader对象
    187 ///</summary>
    188 ///<param name="trans">事务</param>
    189 ///<param name="selectSql">查询语句</param>
    190 ///<param name="para">参数列表</param>
    191 ///<returns>返回DataReader</returns>
    192         public override IDataReader GetReaderTrans(SqlTransaction trans, String selectSql, SqlParameter[] para)
    193         {
    194             if (selectSql == null) throw new ArgumentNullException("selectSql");
    195             if (para == null) throw new ArgumentNullException("para");
    196 
    197             return SqlHelper.ExecuteReader(trans, CommandType.Text, selectSql, para);
    198         }
    199 
    200         #endregion
    201 
    202         #region 执行存储过程
    203         ///<summary>
    204 /// 执行非查询存储过程
    205 ///</summary>
    206 ///<param name="spName">存储过程名称</param>
    207         public override void ExecuteSp(String spName)
    208         {
    209             if (spName == null) throw new ArgumentNullException("spName");
    210 
    211             SqlHelper.ExecuteNonQuery(_connectionString, CommandType.StoredProcedure, spName);
    212         }
    213 
    214         ///<summary>
    215 /// 执行非查询存储过程
    216 ///</summary>
    217 ///<param name="trans">事务对象</param>
    218 ///<param name="spName">存储过程名称</param>
    219         public override void ExecuteSp(SqlTransaction trans, String spName)
    220         {
    221             if (trans == null) throw new ArgumentNullException("trans");
    222             if (spName == null) throw new ArgumentNullException("spName");
    223 
    224             SqlHelper.ExecuteNonQuery(trans, CommandType.StoredProcedure, spName);
    225         }
    226 
    227         ///<summary>
    228 /// 执行非查询存储过程
    229 ///</summary>
    230 ///<param name="spName">存储过程名称</param>
    231 ///<param name="para">参数列表</param>
    232         public override void ExecuteSp(String spName, SqlParameter[] para)
    233         {
    234             if (spName == null) throw new ArgumentNullException("spName");
    235             if (para == null) throw new ArgumentNullException("para");
    236 
    237             SqlHelper.ExecuteNonQuery(_connectionString, CommandType.StoredProcedure, spName, para);
    238         }
    239 
    240         /// 执行非查询存储过程
    241 ///</summary>
    242 ///<param name="trans">事务对象</param>
    243 ///<param name="spName">存储过程名称</param>
    244 ///<param name="para">参数列表</param>
    245         public override void ExecuteSp(SqlTransaction trans, String spName, SqlParameter[] para)
    246         {
    247             if (trans == null) throw new ArgumentNullException("trans");
    248             if (spName == null) throw new ArgumentNullException("spName");
    249             if (para == null) throw new ArgumentNullException("para");
    250 
    251             SqlHelper.ExecuteNonQuery(trans, CommandType.StoredProcedure,
    252                 spName, para);
    253         }
    254 
    255         ///<summary>
    256 /// 执行查询存储过程获取Reader对象
    257 ///</summary>
    258 ///<param name="spName">存储过程名称</param>
    259 ///<returns>返回DataReader</returns>
    260         public override IDataReader GetReaderBySp(String spName)
    261         {
    262             if (spName == null) throw new ArgumentNullException("spName");
    263 
    264             return SqlHelper.ExecuteReader(_connectionString,
    265                 CommandType.StoredProcedure, spName);
    266         }
    267 
    268         ///<summary>
    269 /// 执行查询存储过程获取Reader对象
    270 ///</summary>
    271 ///<param name="spName">存储过程名称</param>
    272 ///<param name="para">参数列表</param>
    273 ///<returns>返回DataReader</returns>
    274         public override IDataReader GetReaderBySp(String spName, SqlParameter[] para)
    275         {
    276             return SqlHelper.ExecuteReader(_connectionString,
    277                 CommandType.StoredProcedure, spName, para);
    278         }
    279 
    280         ///<summary>
    281 /// 执行查询存储过程获取单值
    282 ///</summary>
    283 ///<param name="spName">存储过程名称</param>
    284 ///<returns>返回Object</returns>
    285         public override Object GetScalarBySp(String spName)
    286         {
    287             return SqlHelper.ExecuteScalar(_connectionString,
    288                 CommandType.StoredProcedure, spName);
    289         }
    290 
    291         ///<summary>
    292 /// 执行查询存储过程获取单值
    293 ///</summary>
    294 ///<param name="spName">存储过程名称</param>
    295 ///<param name="para">参数列表</param>
    296 ///<returns>返回Object</returns>
    297         public override Object GetScalarBySp(String spName, SqlParameter[] para)
    298         {
    299             return SqlHelper.ExecuteScalar(_connectionString,
    300                 CommandType.StoredProcedure, spName, para);
    301         }
    302 
    303         ///<summary>
    304 /// 根据存储过程获取数据集
    305 ///</summary>
    306 ///<param name="spName">存储过程</param>
    307 ///<returns>返回数据集</returns>
    308         public override DataSet GetDatasetBySp(String spName)
    309         {
    310             if (spName == null) throw new ArgumentNullException("spName");
    311 
    312             DataSet ds = new DataSet();
    313             SqlHelper.FillDataset(_connectionString, CommandType.StoredProcedure, spName, ds, null);
    314             return ds;
    315         }
    316         ///<summary>
    317 /// 根据带参数的存储过程获取数据集
    318 ///</summary>
    319 ///<param name="spName">存储过程</param>
    320 ///<param name="para">参数列表</param>
    321 ///<returns>返回数据集</returns>
    322         public override DataSet GetDatasetBySp(String spName, SqlParameter[] para)
    323         {
    324             if (spName == null) throw new ArgumentNullException("spName");
    325             if (para == null) throw new ArgumentNullException("para");
    326 
    327             DataSet ds = new DataSet();
    328             SqlHelper.FillDataset(_connectionString, CommandType.StoredProcedure, spName, ds, null, para);
    329             return ds;
    330         }
    331         #endregion
    332 
    333         #endregion
    334     }
    335 }
    

      


    微软本身是的SqlHelper类提供高性能可扩充的数据库访问方法,代码就不啰嗦大家都懂的,通过集成和改造对数据访问的安全性,扩展性做进一步的伸展

    测试 同时加载1w条数据试一试,方法执行时间,忽略浏览器加载时间

    改造数据访问:

    方法执行时间

    企业库:

    方法执行时间

    普通DBHlper:

    方法执行时间

    同时加载10W条数据试一试:

    改造后10W条数据访问时间:

    企业库10W数据访问时间:

    普通DBHelper,10W条数据访问时间:

    当然了测试和机器配置也相关,以上数据仅供参考,不一定准确,还有很多地方不是很完善,你的项目采用的是什么数据交互模式来?有没有更好的意见和建议,期待达人们的意见和建议。

  • 相关阅读:
    (一)Redis初学教程之安装篇
    Redis常用数据类型
    css
    js常用内置对象、Dom对象、BOM对象
    CSS定位(postion)和移动(float)
    Razor模板引擎(C#版)语法
    虚拟化和反序列化
    id 自增------删除数据后恢复到删除前自增id
    SERVER全局数组
    文件路径操作
  • 原文地址:https://www.cnblogs.com/tomfang/p/2248723.html
Copyright © 2011-2022 走看看