C#自带的string.Intern方法,会将字符串保留着字符串池中,并且永远不会释放。

对于查询服务器这样请求量非常大,并且不断变化的应用场景,永久保留这些字符串,会带来严重的负担——并且也没有必要永久保存这些数据,只对最近执行的request缓存即可

故自行设计了Intern方法,可以手动清除(也可以周期性的清楚)

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Concurrent;

namespace Hotel.Product.SearchService.InternalEntity
{
    /// <summary>
    /// Enity project使用的工具类    
    /// </summary>
    public static class StringUtility
    {
        /// <summary>
        /// Get intern string for the sourceString.
        /// </summary>
        public static string Intern(string sourceString)
        {
            try
            {
                if (sourceString == null)
                {
                    return null;
                }
                return dictionary.GetOrAdd(sourceString, sourceString);
            }
            catch (Exception e)
            {
                return sourceString;
            }
        }

        /// <summary>
        /// Remove all intern strings
        /// </summary>
        public static void Clear()
        {
            try
            {
                //回收前记录下来,用于信息统计
                listConcurrent++;
                dictionary = new ConcurrentDictionary<string, string>();
            }
            catch (Exception e)
            {
                // ignore exception
            }
        }

        /// <summary>
        /// 获取驻留的字符串个数
        /// </summary>
        /// <param name="listCount"></param>
        /// <returns></returns>
        public static Int32 StringCount()
        {
            return dictionary.Count;
        }

        /// <summary>
        ///回收的数量
        /// </summary>
        /// <param name="listCount"></param>
        /// <returns></returns>
        public static Int32 ClearCount()
        {
            return listConcurrent;
        }

        private static int listConcurrent = 0;

        private static ConcurrentDictionary<string, string> dictionary = new ConcurrentDictionary<string, string>();
    }
}
View Code