zoukankan      html  css  js  c++  java
  • CastleActiveRecord 二级缓存心得


    在使用CaslteActiveRecord开启二级缓存时

    1、如果一个实体标记了  缓存属性,则无论该类是 通过ID查询还是其它方式的查询得到的结果,都会自动缓存,标记如下:

     所以,不必再担心结果是否能够按照预期的需要缓存。

      [ActiveRecord("T_GeographicBoundary",Cache=CacheEnum.NonStrictReadWrite)]

    public class DALGeographicBoundary : ActiveRecordBase<DALGeographicBoundary>
    {
    }

     2、查询缓存如何使用? 在CastleActiveRecord中的查询类没有提供对查询缓存的支持,只能使用NHibernate的查询才可以,例子如下:

     public static DALGeographicBoundary[] Find(string name)

            {
                string queryString = @"select distinct c from DALGeographicBoundary as c ";
                
    if (!string.IsNullOrEmpty(name))
                {
                    queryString 
    += " where c.Name like :Name or c.Code like :Name or c.EnglishName like :Name or c.PinYin like :Name or c.FullPinYin like :Name ";
                }
                queryString 
    += " order by c.Name asc ";
                
                ISessionFactoryHolder sessionFactory 
    = ActiveRecordMediator.GetSessionFactoryHolder();

                ISession session 
    = sessionFactory.CreateSession(typeof(DALGeographicBoundary));

                IQuery query 
    = session.CreateQuery(queryString);
                
    if (!string.IsNullOrEmpty(name))
                {
                    query.SetParameter
    <string>("Name"string.Format("%{0}%", name));
                }
                query.SetCacheable(
    true);
                IList
    <DALGeographicBoundary> userlist = query.List<DALGeographicBoundary>();
                
    if (userlist != null && userlist.Count > 0)
                {
                    DALGeographicBoundary[] temp 
    = new DALGeographicBoundary[userlist.Count];
                    userlist.CopyTo(temp, 
    0);
                    
    return temp;
                }
                
    else
                {
                    
    return null;
                }

            }

     3、缓存的性能,缓存在一定程度上可以提高应用的性能,但需要正确认使用,如果使用不慎,缓存反而成为负担,比如,在应用中如果使用NHibernate.Caches.Prevalence 做为缓存提供程序,如果数据量大,它要在指定目录下写入缓存文件,IO消耗相当大,虽然数据库访问少了,但是应用的IO却增长,还不如不使用缓存。因此,使用缓存时应尽量避免使用文件型缓存,应使用内存型缓存。

     4、如何使用缓存,缓存的策略。

    查询缓存应只对只读性数据进行缓存,如果是经常读写的数据,可能造成数据不一致。 

    5、使用缓存的几种方法

    public static DALDictionaries[] FindByCategory(int ownerID, string category)
            {
                
    //string queryString = @"select distinct dics from DALDictionaries as dics where dics.OwnerID=:OwnerID and dics.Category=:Category order by dics.SortIndex";
                
    //SimpleQuery<DALDictionaries> sq = new SimpleQuery<DALDictionaries>(queryString);
                
    //sq.SetParameter("OwnerID", ownerID);
                
    //sq.SetParameter("Category", category);
                
    //return sq.Execute();

                
    string queryString = @"select distinct dics from DALDictionaries as dics where dics.OwnerID=:OwnerID and dics.Category=:Category order by dics.SortIndex ";
                
                ISessionFactoryHolder sessionFactory 
    = ActiveRecordMediator.GetSessionFactoryHolder();
                ISession session 
    = sessionFactory.CreateSession(typeof(DALDictionaries));
                IQuery query 
    = session.CreateQuery(queryString);
                query.SetParameter(
    "OwnerID", ownerID);
                query.SetParameter(
    "Category", category);
                query.SetCacheable(
    true);

                IList
    <DALDictionaries> list = query.List<DALDictionaries>();
                
    return list.ToArray<DALDictionaries>();

                
    //string queryString = @"select distinct dics.ID from DALDictionaries as dics where dics.OwnerID=:OwnerID and dics.Category=:Category ";
                
    //SimpleQuery<int> sq = new SimpleQuery<int>(typeof(DALDictionaries), queryString);
                
    //sq.SetParameter("OwnerID", ownerID);
                
    //sq.SetParameter("Category", category);
                
    //int[] ids = sq.Execute();
                
    //if (ids != null && ids.Length > 0)
                
    //{
                
    //    List<DALDictionaries> temp = new List<DALDictionaries>();
                
    //    foreach (int id in ids)
                
    //    {
                
    //        temp.Add(DALDictionaries.Find(id));
                
    //    }
                
    //    temp.Sort<DALDictionaries>(new string[] { "SortIndex" });
                
    //    return temp.ToArray();
                
    //}
                
    //else
                
    //{
                
    //    return null;
                
    //}
            }

     6、如果实体有继承关系,必须在被继承的类上也标记使用 缓存,否则,子类的缓存无效。

     7、如果对查询进行缓存,必须实体也要标记缓存,否则查询缓存无效。 

  • 相关阅读:
    Java入门——day42
    第六周进度报告
    Java入门——day41
    Java入门——day40
    Java入门——day39
    Java入门——day38
    Java入门——day37
    Java入门——day36
    Java入门——day35
    第五周进度报告
  • 原文地址:https://www.cnblogs.com/yyj/p/2029136.html
Copyright © 2011-2022 走看看