知识点:DataTable、Linq、lamda表达式、Cache

场景:查询部门的所有员工和管理员,并分配相应的权限

实现过程一般为:查询部门,遍历部门(查询员工、分配权限、查询管理员、分配权限)

访问数据库比较频繁的环节为遍历部门里面的查询员工和管理员,所有我们尝试在这里进行优化

1.将用户全部读取出来存入DataTable对象中,下一次可直接从DataTable中查询数据而不必再读取数据库,但即便存入DataTable对象,DataTable对象也会在页面刷新或回发时丢失,所以将DataTable对象存入.Net Cache中。(这与存入Session有质的差别)。

代码:

if (Page.Cache["users"] == null)
Page.Cache.Insert("users", UsersCom.GetSimpleUser(), null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes());
DataTable dt = (DataTable)Page.Cache["users"];

其中Page.Cache.Insert最后两个参数指示缓存到期时间;

UsersCom.GetSimpleUser()是从数据库中查询数据的方法,返回的是DataTable对象。尽量不要返回所有的字段,而是需要的字段。这里返回的字段包括user_id、unit_id。

2.从Cache中查询数据,也就是查询DataTable对象,查询的方法很多,从最简单的开始。

代码:

dt.Select("unit_id=" + unitID);

直接使用DataTable的Select方法查询数据,返回DataRow数组,如果你并不想要得到DataRow数组,此时你不得不遍历该数组重新组装成其它对象。

这个效率也许没有使用Linq的效率高,既然这样那就直接使用Lamda表达式吧!

代码:

dt.AsEnumerable().Where(t => t.Field<decimal>("unit_id") == unitID).Select(t => t.Field<decimal>("user_id")).ToList();

返回List<decimal>对象;

注:你需要using System.Linq;和在解决方案中引用System.Data.DataSetExtensions(不需要在代码中using)。

当然如果你要使用Linq,代码如下:

(from t in dt.AsEnumerable()
where t.Field<decimal>("unit_id") == unitID
select t.Field<decimal>("user_id")).ToList();

返回List<decimal>对象;

3.适当的时候使用多线程

该场景实例运行时间较长,所以开启了新线程。也避免了UI线程的等待。

你可以封装一个线程执行类,最后将这个类对象存入Session,随时可以检测运行状态。

代码:

    /// <summary>
/// Asp.net线程执行类
/// </summary>
public class DocWork
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="method">执行方法</param>
public DocWork(Action method)
{
this.method = method;
} private DateTime startTime;
/// <summary>
/// 开始时间
/// </summary>
public DateTime StartTime
{
get { return startTime; }
} private DateTime endTime;
/// <summary>
/// 结束时间
/// </summary>
public DateTime EndTime
{
get { return endTime; }
} private DateTime errorTime;
/// <summary>
/// 发生错误时间
/// </summary>
public DateTime ErrorTime
{
get { return errorTime; }
} private Thread currnetThread;
/// <summary>
/// 当前线程
/// </summary>
public Thread CurrnetThread
{
get { return currnetThread; }
} private string errorInfo;
/// <summary>
/// 错误信息
/// </summary>
public string ErrorInfo
{
get { return errorInfo; }
} private Action method;
/// <summary>
/// 执行方法
/// </summary>
public Action Method
{
get { return method; }
set { method = value; }
}
/// <summary>
/// 开始执行
/// </summary>
public void Start()
{
if (currnetThread == null || currnetThread.ThreadState == ThreadState.Stopped)
{
currnetThread = new Thread(new ThreadStart(WorkMethod));
currnetThread.Start();
}
}
/// <summary>
/// 挂起线程
/// </summary>
public void Suspend()
{
if (currnetThread != null && currnetThread.ThreadState == ThreadState.Running)
{
currnetThread.Suspend();
}
}
/// <summary>
/// 继续执行挂起线程
/// </summary>
public void Resume()
{
if (currnetThread != null && currnetThread.ThreadState == ThreadState.Suspended)
{
currnetThread.Resume();
}
}
/// <summary>
/// 终止执行
/// </summary>
public void Abort()
{
if (currnetThread != null)
{
currnetThread.Abort();
}
}
/// <summary>
/// 线程方法
/// </summary>
protected void WorkMethod()
{
if (Method != null)
{
try
{
startTime = DateTime.Now;
Method.Invoke();
}
catch (Exception ex)
{
errorTime = DateTime.Now;
errorInfo = ex.Message + "|" + ex.Source;
}
finally
{
endTime = DateTime.Now;
}
}
}
}

数据访问优化的方法很多,且针对不同的环节方法也不同,本文演示的是数据库数据查询到页面处理环节。

本文地址:.Net频繁访问数据库的优化探究 转载请标明出处

.Net频繁访问数据库的优化探究(一)的更多相关文章

  1. Entity FrameWork 中使用Lambda访问数据库性能优化

    在使用Entity Framework 访问数据库时,我们经常使用Lambda表达式,但是如果不小心的话,很容易就掉到坑里了.比如下面的例子:用Lambda访问MSSqlServer中的NewsInf ...

  2. Entity FrameWork 中使用Expression<Func<T,true>>访问数据库性能优化

    问题的本质是:扩展的Where方法有四个参数重载.传进去Func<T,true>那么返回值是IEnumable的接口类型的集合,如果是Expression<Func<T,tru ...

  3. MYSQL数据库的优化

    我们究竟应该如何对MySQL数据库进行优化?下面我就从MySQL对硬件的选择.MySQL的安装.my.cnf的优化.MySQL如何进行架构设计及数据切分等方面来说明这个问题. 服务器物理硬件的优化 在 ...

  4. 转载:SqlServer数据库性能优化详解

    本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...

  5. sql server之数据库语句优化

    三.只返回需要的数据 返回数据到客户端至少需要数据库提取数据.网络传输数据.客户端接收数据以及客户端处理数据等环节,如果返回不需要的数据,就会增加服务器.网络和客户端的无效劳动,其害处是显而易见的,避 ...

  6. [转]MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验

    本文转自:http://liangweilinux.blog.51cto.com/8340258/1728131 年,嘿,废话不多说,下面开启MySQL优化之旅! 我们究竟应该如何对MySQL数据库进 ...

  7. mysql数据库性能优化(包括SQL,表结构,索引,缓存)

    优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...

  8. 数据库性能优化:SQL索引

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  9. 26种提高ASP.NET网站访问性能的优化方法 .

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...

随机推荐

  1. sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序

        这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境 ...

  2. poj2096 Collecting Bugs[期望dp]

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 5394   Accepted: 2670 ...

  3. jfinal的controller默认访问的方法是什么

    index()方法: 如: @Controller("/test/exam")public class TestController 如下请求请求:http://localhost ...

  4. sublime3095-注册码下载安装

    链接:http://pan.baidu.com/s/1hqejFKS 下载地址:下载 提取密码:egh5 ----- BEGIN LICENSE ----- Andrew Weber Single U ...

  5. 170606、防止sql注入(三)

    SpringMVC利用拦截器防止 SQL注入案例一个简单的PHP登录验证SQL注入 比如一个公司有一个用来管理客户的客户管理系统,在进入后台进行管理的时候需要输入用户名和密码.假设在客户端传给服务器的 ...

  6. [ASP.NET 大牛之路]02 - C#高级知识点概要(1) - 委托和事件

    在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...

  7. pta 习题集5-17 家谱处理

    人类学研究对于家族很感兴趣,于是研究人员搜集了一些家族的家谱进行研究.实验中,使用计算机处理家谱.为了实现这个目的,研究人员将家谱转换为文本文件.下面为家谱文本文件的实例: John Robert F ...

  8. Gunicorn独角兽

    1. 关于Gunicorn Gunicorn是一个开源的Python WSGI HTTP服务器,移植于Ruby的Unicorn项目的采用pre-fork模式的服务器.Gunicorn服务器可与各种We ...

  9. 当Web访问性能出现问题,如何深探?

    对运维或开发工程师来说,遇到访问性能问题时,最先需要定位的是问题出现在哪个环节,是网络的问题,服务端的问题,还是客户端的问题? 往往技术人员喜欢把精力放在保障后端服务的可用性方面,而对前端界面是否能正 ...

  10. html中使用JS实现图片轮播效果

    1.首先是效果图,要在网页中实现下图的轮播效果,有四张图片,每张图片有自己的标题,然后还有右下角的小方框,鼠标悬浮在小方框上,会切换到对应的图片中去. 2.先是HTML中的内容,最外层是轮播图整个的容 ...