2010-11-26 66 views
1

当我初始化我的客户端连接到的AppFabric的缓存,它似乎不一致需要长达30秒以下行连接:AppFabric的DataCacheFactory初始化往往需〜30秒

factory = new DataCacheFactory(configuration); 

查看完整的init()代码如下 - 主要取自here。 我说不一致,因为它有时需要1秒钟,其他时间27,28等...秒。我有一个使用AppFabric缓存的asp.net网站 - 它位于不同的盒子上(在同一个域中)。除了不一致的连接时间以外,一切工作都很好。当它连接,它的一切都很好 - 我只需要让它在1秒内连续连接:) ......想法?

public static void Init() 
    { 
     if (cache == null) 
     { 
      Stopwatch sw = new Stopwatch(); 
      sw.Start(); 
      try 
      { 
       //Define Array for 1 Cache Host 
       List<DataCacheServerEndpoint> servers = new List<DataCacheServerEndpoint>(1); 

       var appFabricHost = ConfigurationManager.AppSettings["AppFabricHost"]; 
       var appFabricPort = ConfigurationManager.AppSettings["AppFabricPort"].ParseAs<int>(); 

       //Specify Cache Host Details 
       // Parameter 1 = host name 
       // Parameter 2 = cache port number 
       servers.Add(new DataCacheServerEndpoint(appFabricHost, appFabricPort)); 
       TraceHelper.TraceVerbose("Init", string.Format("Defined AppFabric - Host: {0}, Port: {1}", appFabricHost, appFabricPort)); 

       //Create cache configuration 
       DataCacheFactoryConfiguration configuration = new DataCacheFactoryConfiguration(); 

       //Set the cache host(s) 
       configuration.Servers = servers; 

       //Set default properties for local cache (local cache disabled) 
       configuration.LocalCacheProperties = new DataCacheLocalCacheProperties(); 

       //Disable tracing to avoid informational/verbose messages on the web page 
       DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off); 

       //Pass configuration settings to cacheFactory constructor 
       factory = new DataCacheFactory(configuration); 

       //Get reference to named cache 
       cache = factory.GetCache(cacheName); 
       TraceHelper.TraceVerbose("Init", "Defined AppFabric - CacheName: " + cacheName); 
      } 
      catch (Exception ex) 
      { 
       TraceHelper.TraceError("Init", ex); 
      } 
      finally 
      { 
       TraceHelper.TraceInfo("Init", string.Format("AppFabric init took {0} seconds", sw.Elapsed.Seconds)); 
      } 

      if (cache == null) 
      { 
       TraceHelper.TraceError("Init", string.Format("First init cycle took {0} seconds and failed, retrying", sw.Elapsed.Seconds)); 
       UrlShortener.Init(); // if at first you don't succeed, try try again ... 
      } 
     } 
    } 
+0

我很乐意提供更多信息,如果它会有帮助吗? – downatone 2010-12-01 17:38:02

回答

0

这是任何更快和/或如果你一直在config文件中的所有配置信息,而不是编程方式创建的配置更一致?有关详细信息,请参阅here - 我总是使用此方法而不是程序化配置,因为更改某些内容时更容易更新。

否则,我觉得一般的建议是,DataCacheFactory昂贵的对象创建,由于它的作用,即,使集群中的网络连接到各个服务器。你绝对不想在每次需要从缓存中获取某些东西时创建一个DataCacheFactory,相反,你可能想要考虑将它创建为Application_Start或许是一个单例,然后在整个应用程序中重用它(这被授予,没有解决的问题,但它可能有助于缓解它)。

+0

感谢您的回复 - 一直到我得到解决为止,都没有能够推动它。我已经在Application_Start上调用Init(),并重用它的单例。一旦Init()完成,我没有问题,它只是最初的潜力~30秒,这是踢球(见这里:http://stackoverflow.com/questions/4338340/overlapped-recycle-and-application-start)。我会按照建议将AppFabric配置移动到web.config中,并会通知您是否可以解决问题。干杯。 – downatone 2010-12-09 16:26:55