110,502
社区成员
发帖
与我相关
我的任务
分享
//代码拼音码与自定义码组合的引用类型
sealed class CodePairRef
{
public Char PinyinCode;
public Char UserDefineCode;
public Int64 Times;//被访问的次数
}
//用于将字符串翻译成拼音码与自定义码的类
static class Encode
{
private static Dictionary<Char, CodePairRef> cache = new Dictionary<Char, CodePairRef>(); //缓存字典
public static Int32 Capacity //缓存最大容量
{
get { return _capacity; }
set { _capacity = value; }
}static Int32 _capacity = 997;// :)
public static String sql = "get_py_wb";//存储过程
private static Object lockHelper = new Object();
private static String connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ToString();//公共的连接字符串
public static CodePairRef Process( Char ch)
{
if (cache.ContainsKey(ch)) //命中缓存
{
CodePairRef pair = cache[ch];
++pair.Times;
return pair;//返回缓存数据
}
SqlParameter[] sqlParams =
{
new SqlParameter("@chinese",SqlDbType.NVarChar,1),
new SqlParameter("@py_result",SqlDbType.NVarChar,1),
new SqlParameter("@wb_result",SqlDbType.NVarChar,1)
};
sqlParams[0].Value = ch;
sqlParams[1].Direction = ParameterDirection.Output;
sqlParams[2].Direction = ParameterDirection.Output;
try
{
SqlHelper.ExecuteNonQuery( connectionString , CommandType.StoredProcedure, sql, sqlParams);//参数化查询进行解码
}
catch
{
return null;
}
String py = sqlParams[1].Value as String;
String udef = sqlParams[2].Value as String;
if (String.IsNullOrEmpty(py) || String.IsNullOrEmpty(udef))
{
return null;
}
try
{
CodePairRef pair = new CodePairRef(); //构建返回值
pair.PinyinCode = py[0];
pair.UserDefineCode = udef[0];
cache.Add(ch, pair);//将新查询到的结果添加进缓存
#region 自动扩容与删除不常用数据
if (cache.Count >= Capacity)//当缓存数据超过最大容量的时候进行扩容与删除不常用数据
{
lock (lockHelper)
{
if (cache.Count >= Capacity)//2+1组合确保以下程序块在条件满足时只被执行一次
{
foreach (KeyValuePair<Char, CodePairRef> value in cache)
{
if (value.Value.Times < (Capacity/2))
{
cache.Remove(value.Key);
}
}
if (cache.Count >= Capacity)
{
Capacity *= 2;
}
}
}
}
#endregion
return pair;
}
catch
{
return null;
}
}
}
public static class BLL
{
public static string 根据拼音字头查询用户汉字名(string 拼音字头)
{
return 查询数据库返回用户汉字名(拼音字头);
}
......
public static string[] 根据拼音字头查询用户汉字名(string 拼音字头)
{
var key=string.Format("拼音字头{0}对应的用户名",拼音字头);
var ret=(string[])Cache[key];
if(ret==null)
{
ret=查询数据库返回用户汉字名(拼音字头);
//这里作为一个demo,缓存3分钟(用于应付突发情况)。实际上第三个参数更重要,而不应该是null。
Cache.Insert(key,ret,null,Cache.NoAbsoluteExpiration, new TimeSpan(0, 3, 0));
}
return 查询数据库返回用户汉字名(拼音字头);
}