• Visual studio 2005 缓存技术助E8.Net工作流2008 经历巨大处理能力挑战


     

    Visual studio 2005 缓存技术助E8.Net工作流2008 经历巨大处理能力挑战。

       回顾E8.Net工作流的发展历程,2004-2005年经历了某省邮政局全体管理人员使用的办公自动化系统考验后,E8的处理能力提到过非常大的提升,之后几十个200-2000之间用户数的系统,日处理流程实例数在100 -400之间的系统基本上性能体验很流畅,2006年底某市邮政局185综合服务系统采用E8.Net工作流系统处理EMS揽收、电子商务、通行证签注、淘宝网物流配送。。。。刚开始的时候40个台席,日均处理流程数量是700左右。 随着业务的扩展及应用模式的成熟,到2007年年底时已经达到200个台席,B/S架构系统日均处理流程数量达12000单每日。这个过程也是E8.Net工作流2008版本的成长过程。其中Visual studio 2005中的SQL 缓存依赖技术是E8工作流经历这种挑战用到的比较重要的技术之一。

      大家知道CACHE技术是.net中一个非常有价值的技术,。NET20支持SqlCacheDependency 可以使CACHE依赖数据库表的变化而失效,保证获取最有效的数据,但可以减少数据库CPU压力。E8中用到的相关技术总结一下与大家分享。

    优化思路回顾:

       1、将操作调用频繁,数据很少变化,实时性要求不严格的数据库相关操作改为内存数据库处理模式操作,利用CACHE技术和 SqlCacheDependency 技术。构造相关数据的内存数据模型。提高计算效率并减少数据库处理压力。

       2、调整流程模型数据、组织结构数据变化更新少数几个数据表,使SqlCacheDependency CACHE依赖的表比较集中,保证CACHE缓存检测的效率

       3、为内存数据提供强制失效的处理接口,保证相关数据变化后,重新加载内存数据

       。。。。。。

    范例代码:

     

    string Key = "xxxxxxCache_" + CacheName.ToLower();
                
    string strSQL = "";
                
    bool blnConstraint = false;     //为SQL缓存依赖添加 强制取消的功能
                if (sCacheSource == string.Empty)
                
    {
                    sCacheSource 
    = System.Configuration.ConfigurationSettings.AppSettings["SqlCacheDataSource"]; 
                }

                DataTable dt 
    = null;
                SqlCacheDependency scd;


                
    //判断SQL缓存依赖添加 强制取消
                
    // 通过外部程序相关 cache 赋值的方式               switch (CacheName.ToLower())
                {
                    
    case "app":
                        
    break;
                    
    case "masteruserdept":
                     ..
                    
    case "user":
                     ..
                        
    break;
                    
    case "dept":
                        
    //判断dept变化
                        .
                        
    break;
                    
    case "actorcond":
                    
    case "flowmodelall":
                    
    case "flowmodelnodesall":
                    
    case "flowmodel":
                    
    case "flowmodelnodes":
                        
    //判断FLOWMODEL变化
                        .
                        
    break;
                    
    default:

                        
    break;
                }


                

              

                
    if (HttpRuntime.Cache[Key] == null)
                
    {
                    
    //取数据
                    try
                    
    {
                        
    switch (CacheName.ToLower())
                        
    {
                            
    case "app":
                                strSQL 
    = "SELECT * FROM xxxxx ";
                                dt 
    = MyDataBase.QueryDataTableByStr(strSQL);

                                scd 
    = new SqlCacheDependency(sCacheSource, "es_app");
                                HttpRuntime.Cache.Insert(Key, dt, scd);
                                
    break;
                            
                            
    case "user":
                                
    //必须考虑历史情况
                                                            strSQL = "SELECT * FROM xxxxx ";
                                dt 
    = MyDataBase.QueryDataTableByStr(strSQL);

                                scd 
    = new SqlCacheDependency(sCacheSource, "ts_user");
                                HttpRuntime.Cache.Insert(Key, dt, scd);
                                
                                
    break;
                            
    case "dept":
                                
    //必须考虑历史情况
                                                            strSQL = "SELECT * FROM xxxx"
                                dt 
    = MyDataBase.QueryDataTableByStr(strSQL);

                                scd 
    = new SqlCacheDependency(sCacheSource, "ts_dept");
                                HttpRuntime.Cache.Insert(Key, dt, scd);
                                
    break;
                            
    case "masteruserdept":
                              .
                                
    break;
                            
    case "flowmodelnodes":
                                .                            
    break;
                            
    case "flowmodelall":
                                .
                                
    break;
                            
    default:
                                
                                
    break;
                        }


                        
                    }

                    
    catch(Exception e)
                    
    {
                        dt 
    = null;
                        
    //如果有错误发生配置一下 SQL 缓存
                      

                    }

                    
                }

                
    else
                
    {
                    
    //从缓存中取值
                    dt= (DataTable)HttpRuntime.Cache[Key];
                }

                
    return dt;


      在这里感谢客户提供的思路。

    E8.Net工作流平台为.Net企业应用开发提供了一个起点。E8.Net工作流提升企业战略执行力,欢迎访问: http://www.feifanit.com.cn/productFlow.htm

    QQ群: 48132184 53284682

     

     

     

    E8.Net工作流平台 提升企业战略执行力
    http://www.feifanit.com.cn

    E8在线,打造中小企业一站式管理软件租用平台

    http://www.onlinee8.net

     

    E8软件 提升企业战略执行力
    http://www.chinae8.net
    流程银行QQ群 :74080032

    【流程管理】微信公众号:e8flow
  • 相关阅读:
    策略模式
    简单工厂模式
    单例模式
    sp_xml_preparedocument _使用 处理XML文档
    LINQ to XML
    动态Linq(结合反射)
    IEqualityComparer<T>接口
    Linq to object 技巧、用法集锦
    IComparer<T> 接口Linq比较接口
    Linq to BBJECT之非延时标准查询操作符
  • 原文地址:https://www.cnblogs.com/cancanwyq/p/1068605.html
Copyright © 2020-2023  润新知