亚音速,支持缓存

时间:2009-07-10 20:43:06

标签: caching subsonic subsonic3

考虑到具有以下要求的项目。

  • 数据阅读密集型应用程序。
  • 每次最多100个并发用户。应用程序的流量非常高
  • 虽然数据很大,但每天只修改一次

决定使用易于开发的亚音速原因以及在高交通环境中工作的潜力。

虽然很少有东西尚未找到/解决使用SubSonic 3

  • 使用Active Records,Repository,Linq To SQL
  • 的哪种类型的图层
  • 使用分页/排序存储过程(因为它们会提供比内置分页机制更好的性能,当显示10000多行时进行分页和排序。对吧?)
  • 缓存,项目要求非常明确,需要大量使用缓存。但找不到合适的解决方案,这将适用于亚音速。 我是否必须为它创建单独的图层,如果是的话,一个简短的示例会有所帮助。

3 个答案:

答案 0 :(得分:3)

我为亚音速2.x ActiveRecord编写了一个CacheUtil类。它基于某些人在旧的亚音速论坛上发布的代码。 (这是在删除最后一个论坛之前删除的论坛。这就是软件论坛应该是永久性的原因。)以下是一个缓存Find方法的示例。你可以将它改编为ss3。还有插入,fetchall,删除,清除等。当时Rob Connery说缓存有问题,而且它故意被排除在ss2之外。通过使用HttpRuntime.Cache,我可以同时共享Web应用程序和服务之间的缓存。我相信我可以这样做,因为它是一个小应用程序,总是在一台服务器上。

public static RecordBase<T> Find<T, ListType>(object primaryKeyValue)
    where T: RecordBase<T>, new()
    where ListType: AbstractList<T, ListType>, new()
{
    string key = typeof(T).ToString();
    if(HttpRuntime.Cache[key] == null)
        FetchAll<T, ListType>();
    if(HttpRuntime.Cache[key] != null)
    {
        ListType collection = (ListType)HttpRuntime.Cache[key];
        foreach(T item in collection)
        {
            if(item.GetPrimaryKeyValue().Equals(primaryKeyValue))
                return item;
        }
    }
    return null;
}

答案 1 :(得分:1)

wrote a post about how I used caching with SubSonic 2.x。它与3.x不是100%兼容,但概念是相同的。

答案 2 :(得分:1)

我在这里Thread-safe cache libraries for .NET同样回答了这个问题。基本上你需要一个CollectionCacheManager - 然后我在每个类型的顶部添加一个层,并通过这个单独的缓存控制器汇集所有请求,而这些缓存控制器又使用1个collectioncachecontroller。在外层,我混合了纯亚音速,linq,无论什么都符合当时的法案。这就是SubSonic的美妙之处在于它不应该妨碍你。至于存储的proc性能,我会指出Jeff Atwoods在CodingHorror上发表的文章并重新说明你的积蓄。硬件很便宜,内存和数据库都不便宜。就个人而言,我保持数据库超级简单和轻量级,并且更喜欢让我的web服务器缓存内存中的所有内容。数据库服务器可以做很少的工作,这是我喜欢的方式。添加一些额外的负载平衡Web服务器并不像增加数据库吞吐量,群集或分片数据库那么大。 SQL&amp;存储过程也可能非常难以编写和维护。拿你花在你那个时间上的预算,而不是加强你的硬件......记住硬件很便宜,好的开发人员不是。祝你好运!