• Flex4 Net服务端内存数据管理


    使用Flex+net开发程序,但还是停留在原来的web习惯上,想用session之类存储一个后台数据,但是,使用的不是webservice 方式,而且remoting方式,所以服务端没有session,那该怎么存储服务端的数据呢?当然是暂存,因为还没必要立刻插入到数据库中。

    考 虑了好久,也google&baidu了好久,始终不得解。后来觉得是不是我的想法有问题,或许现在改用flex做前台,就不需要在服务器端暂存 数据了,我们已经把瘦客户端变成富客户端,同理,现在是瘦服务端,所以将中间数据暂存在客户端,然后服务端用的时候从客户端取呢?

    后来考虑了,还是将数据存储在服务端,具体思路:

    写一个单例Comm类来管理所有连接的数据,再用一个Vars类来具体管理每一个连接的数据。

     Comm类部分代码:


    代码
    private volatile static Comm instance = null;
            
    private static object lockHelper = new object();

            
    private Comm()
            {
                SqlConn 
    = System.Configuration.ConfigurationManager.ConnectionStrings["brxConn"].ConnectionString;
                WebSite 
    = System.Configuration.ConfigurationManager.AppSettings["WebSite"].ToString();
            }
            
    public static Comm Instance
            {
                
    get
                {
                    
    if (instance == null)
                    {
                        
    lock (lockHelper)
                        {
                            
    if (instance == null)
                            {
                                instance 
    = new Comm();
                            }
                        }
                    }
                    
    return instance;
                }
            }
            
    public static void ResetComm()
            {
                instance 
    = null;
            }

    然后在Comm中定义一个Hashtable ht来存储所有的Vars实例,各个连接用Guid来获取其对应的Vars:

    代码
    private Hashtable ht;//hashtable to store vars       
                  
            
    public Vars getVarsbyGuid(string guid)
            {
                
    if (string.IsNullOrEmpty(guid))
                    
    return null;
                
    if (ht == null)
                    ht 
    = new Hashtable();
                
    //删除过期的vars,delete vars before 30 mins
                Hashtable newHt = new Hashtable();
                
    foreach (DictionaryEntry de in ht)
                {
                    
    if (((Vars)de.Value).LastUpdate > DateTime.Now.AddMinutes(-30))
                    {
                        newHt.Add(de.Key, de.Value);
                    }
                }
                ht 
    = newHt;
                Vars myv 
    = null;
                
    if (!ht.ContainsKey(guid))
                {
                    myv 
    = new Vars();
                    myv.LastUpdate 
    = DateTime.Now;
                    ht.Add(guid, myv);
                }
                
    else
                {
                    myv 
    = (Vars)ht[guid];
                    myv.LastUpdate 
    = DateTime.Now;
                }                     
                
    return (Vars)ht[guid];
            }        

    同时为了节约内存,对超时的vars进行回收。

    为了实现回收,需要在Vars中设置最后更新时间:

    代码
    public class Vars
        {
            
    /// <summary>
            
    /// once lastupdate is 30minutes ago , we delete it from memory
            
    /// </summary>
            public DateTime LastUpdate { getset; }

            
    public DataSet dataSet { getset; }
            
    public string notes { getset; }
            
    public string report { getset; }
            
    public string textHead { getset; }

            
    public string regNo { getset; }
            
    public string companyName { getset; }
            
    public string finEnd { getset; }
            
    public string byType { getset; }
            
    public string byNet { getset; }
            
    public string bySingle { getset; }
        }

    最后,总结下思路:

    1服务器启动初始化Comm

    2客户端连接,获取Guid

    3利用Guid从Comm创建或获取Vars

    4每次获取Vars时同步更新时间

    5每次获取Vars时扫描全部Hashtable,将超时的Vars回收

    6客户端退出时从Comm销毁Vars

    思路很简单,文笔很幼稚,就是记录下自己思考的心得,呵呵~

  • 相关阅读:
    ES6 | 关于class类 继承总结
    ES6 | class类的基本语法总结
    开发辅助 | 阿里图标库iconfont入门使用
    JS基本功 | JavaScript专题之数组 方法总结
    前端模块化 | 解读JS模块化开发中的 require、import 和 export
    IOS开发中UITableView和UITableViewCell的几种样式
    SSM项目的搭建
    Linux离线安装Docker
    Http项目转Https项目
    SpringBoot项目的搭建
  • 原文地址:https://www.cnblogs.com/4kapple/p/1895749.html
Copyright © 2020-2023  润新知