zoukankan      html  css  js  c++  java
  • Visual Studio 2005 通过静态变量及可系列化的HASHTABLE变量优化工厂模式(Factory)的效率,提升性能(E8.Net工作流应用系统优化系列四)

             E8.Net工作流架构及工作流引擎中有用到不少对象工厂模式,帮助具体业务逻辑的分别实现,比如工作流引擎中调用到业务接口对象,利用对象工厂模式实现具体的业务接口,传统方式下,我们会根据相关的配置信息,生成相应的实例.
                

          这样工作流引擎就能实现到具体的业务规则了.
                 未经优化的传统做法中,会经常去获取配置信息,并动态生成对象实例,这样会比较耗时.  
            优化前代码:
                
    public ImplDataProcess(long lngAppID)
            
    {
                
    this.mlngAppID = lngAppID;
                
    //后期自动棒定,根据APPID,自动实例化对应的对象
                object newInstance=Assembly.GetExecutingAssembly().CreateInstance(GetAppDataProcessAssembly(mlngAppID));
                
    //object newInstance=Assembly.GetAssembly().CreateInstance(GetAppDataProcessAssembly(mlngAppID));
                dp =(IDataProcess)newInstance;

            }


            
    private static string GetAppDataProcessAssembly(long lngAppID)
            
    {
                
    string strSQL = "";
                SqlDataReader dr;

                
    string strConn = System.Configuration.ConfigurationSettings.AppSettings["SQLConnString"];;

                
    string str = "appDataProcess.";
                strSQL 
    = "SELECT Project,AppCode FROM Es_XXXXX WHERE AppID=" + lngAppID.ToString();
                dr 
    = SqlTool.ExecuteReader(strConn,CommandType.Text,strSQL);
                
    while(dr.Read())
                
    {
                    str 
    = str + dr.GetString(0).Trim() + ".App_" + dr.GetString(0).Trim() + "_" + dr.GetString(1).Trim() + "_DP";
                    
    break;
                }

                dr.Close();

                
    return str;

            }

            未经优化前的代码,每次调用到接口,都会产生一次数据库操作及对象加载的操作.
            优化后代码:
            
     private static Hashtable appsCache = Hashtable.Synchronized(new Hashtable());

            
    public ImplDataProcess(long lngAppID)
            
    {
                
    this.mlngAppID = lngAppID;

                
    string hashKey = "ImplDP_" + lngAppID.ToString();

                IDataProcess idp 
    = appsCache[hashKey] as IDataProcess;
                
    if (idp == null)
                
    {

                    
    //后期自动棒定,根据APPID,自动实例化对应的对象
                    object newInstance = Assembly.GetExecutingAssembly().CreateInstance(GetAppDataProcessAssembly(mlngAppID));
                    
    //object newInstance=Assembly.GetAssembly().CreateInstance(GetAppDataProcessAssembly(mlngAppID));
                    dp = (IDataProcess)newInstance;

                    appsCache[hashKey] 
    = dp;


                }

                
    else
                
    {
                    dp 
    = idp;
                }


            }


            
    private static string GetAppDataProcessAssembly(long lngAppID)
            
    {
                
    string strSQL = "";
                SqlDataReader dr;

                
    string strConn = System.Configuration.ConfigurationSettings.AppSettings["SQLConnString"]; ;

                
    string str = "appDataProcess.";
                
    //2008-02-10 添加SQL缓存依赖的处理方式,减少数据库连接次数
                if (System.Configuration.ConfigurationSettings.AppSettings["SqlCacheModel"== "1")
                
    {

                    DataTable dt 
    = EpSqlCacheHelper.GetDataTableFromCache("app");
                    
    if (dt != null)
                    
    {
                        DataRow[] drs 
    = dt.Select("Appid=" + lngAppID.ToString());

                        
    if (drs.Length > 0)
                        
    {
                            str 
    = str + drs[0]["Project"].ToString() + ".App_" + drs[0]["Project"].ToString() + "_" + drs[0]["AppCode"].ToString() + "_DP";
                        }

                    }


                }

                
    else
                
    {
                    strSQL 
    = "SELECT Project,AppCode FROM Es_XXXX WHERE AppID=" + lngAppID.ToString();
                    dr 
    = SqlTool.ExecuteReader(strConn, CommandType.Text, strSQL);
                    
    while (dr.Read())
                    
    {
                        str 
    = str + dr.GetString(0).Trim() + ".App_" + dr.GetString(0).Trim() + "_" + dr.GetString(1).Trim() + "_DP";
                        
    break;
                    }

                    dr.Close();
                }


                
    return str;


                
    return str;

            }


           优化后的代码主要有以下几个方面的改善.
             通过静态变量保存业务对象实例为HashTable.  如果不存在则创建,存在则直接使用. 配置表的读取,改为了数据库依赖的缓存,避免多次的数据库操作.


          经过一系列的优化措施, 在E8.NET平台下开发的 深圳11185综合服务管理系统,目前B/S架构下轻松处理每日12000单以上的 物流配送 揽收 及电子商务等工作流应用

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

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

    【流程管理】微信公众号:e8flow
  • 相关阅读:
    编译原理-确定有穷自动机(deterministic finite automata ,DFA)
    编译原理-正规式和正规集
    linux之sed用法
    Linux 中find命令
    运维工作应该掌握哪些技能?
    Last_SQL_Error: Error 'Can't drop database
    关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法
    python3.7安装, 解决pip is configured with locations that require TLS/SSL问题
    Linux date命令的用法(转)
    MySQL回滚到某一时刻数据的方法
  • 原文地址:https://www.cnblogs.com/cancanwyq/p/1124711.html
Copyright © 2011-2022 走看看