最近在开发一个专业的网站,在工作完成后对性能进行了一些测试与分析。发现很多值得我们注意的地方。
系统有三层: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); |
通过改造,系统性能得到很大的提高。但系统还有几个可以进行性能优化的地方。如:常用数据的缓冲,分页数据存储过程等。 |