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>(); } }