sadier

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
如何提高 ASP.Net 应用程序的性能
  最近在开发一个专业的网站,在工作完成后对性能进行了一些测试与分析。发现很多值得我们注意的地方。

  系统有三层:Control (UI ) DataProvider (Data) Components (Base)

    后台使用MS Sql Server 2000 ,数据层通过 存储过程来完成所有的数据操作。并编写了一个IDataProvider 接口来定义所有的操作。UI 层只是通过调用IDataProvider 来实现所有的功能。

一开始我们使用的方法:

SqlDataProvider dp = new SqlDataProvider();
dp.Data_registerUser (User user);

   这样就有了一个问题,当一个页面包含大量
控件时,会产生很多的SqlDataProvider 对象,而SqlDataProvider 运行库到项目后期已经非常庞大(已经达到250K左右)。这样在.NET 中已经算80K以上的大对象了。大量创建大对象会非常严重地影响性能。

   那就没有好的方法来解决一下吗?其实,我们不需要创建怎么多对象的。只要有一个SqlDataProvider 对象在内存中就可以了。这样我们想到了 ASP.NET 中的 System.Web.Caching.Cache 类,我们对代码进行了修改。添加了一个类。

//---------------  缓冲 SqlDataProvider.SqlDataProvide ----
public class DataProvider
{
public static IDataProvide Instance()
{

Cache cache = System.Web.HttpContext.Current.Cache;

if ( cache["IDataProviderBase"] == null )
{

String assemblyPath = "SqlDataPrvider.dll"; 
String className = "SqlDataProvider.SqlDataProvide";
assemblyPath = HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath + "/bin/" + assemblyPath);
try
{
cache.Insert( "IDataProvide", Assembly.LoadFrom( assemblyPath).GetType( className ).GetConstructor(new Type[0]), new CacheDependency( assemblyPath ) );
}
catch (Exception)
{
HttpContext.Current.Response.Write("<b>ERROR:</b> Could not locate file: <code>" + assemblyPath + "</code> or could not locate class <code>" + className + "</code> in file.");
HttpContext.Current.Response.End();
}
}
return (IDataProvide)( ((ConstructorInfo)cache["IDataProvide"]).Invoke(null) );
}
}

//--------------修改后的代码------
IDataProvide dp = DataProvider.Instance();
dp.Data_registerUser (User user);

 

   通过改造,系统性能得到很大的提高。但系统还有几个可以进行性能优化的地方。如:常用数据的缓冲,分页数据存储过程等。

posted on 2004-07-28 21:30  毛小华  阅读(587)  评论(0编辑  收藏  举报