2014-01-15 53 views
0

我現在正在爲WebApi 2實施我自己的UserStore,因此它可以與cassandra一起使用。我的問題是,如果我應該在請求後關閉連接併爲下一個請求重新連接到cassandra。與cassandra的永久連接或每個請求的連接?

現在,我正在建立應用程序啓動時的連接,並將cassandra上下文傳遞給UserStore以使用。當我關閉應用程序時連接關閉。

我想知道,例如, 10人同時註冊,這是可能的只有一個連接?

static Startup() 
     { 
      PublicClientId = "self"; 

       //Connecting to Cassandra 
      Cluster cluster = Cluster.Builder().AddContactPoint("127.0.0.1").Build(); 
      Session session = cluster.Connect(); 

      Context context = new Context(session); 

    //passing context 
      UserManagerFactory =() => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); 

      OAuthOptions = new OAuthAuthorizationServerOptions 
      { 
       TokenEndpointPath = new PathString("/Token"), 
       Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory), 
       AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
       AllowInsecureHttp = true 
      }; 
     } 



//UserStore Method for Registration 
    public virtual Task CreateAsync(TUser user) 
    { 
     if (user == null) 
     { 
      throw new ArgumentNullException("user"); 
     } 
     var usertable = _context.GetTable<TUser>("users"); 
     //insert user into table 
    } 
+0

您使用的驅動程序是什麼? –

+0

Datastax c#驅動程序 – bq51

回答

1

當您決定如果您有連接池與否,通常是你需要回答兩個問題:

  1. 什麼是每次建立連接的成本是多少?

根據網絡和機器的類型以及架構設置,在EC2等網絡上建立連接更爲昂貴。如果您每次都建立連接,則可能需要幾毫秒,這就增加了查詢時間。如果您關心保存這些毫秒,那麼彙集連接對您來說是更好的選擇。

  1. 與數據庫的連接是由您的操作系統管理的資源,您的應用程序服務器和數據庫服務器在使用或休眠時所持有的資源。如果你的硬件資源不足,連接應該像文件一樣對待。你打開它們,閱讀或寫信給他們,然後關閉它們。如果您沒有硬件資源限制,則不必擔心資源池的問題。

。如果您設置您的rpc_server_type同步的卡桑德拉的一面,那麼每個連接都會有自己的線程這需要的最低180K,如果你有很多客戶,那麼內存將是你的限制因素。如果您選擇hsha作爲rpc_server_type,那麼這不會成爲問題。 ,你想使之擴展到分發您的請求到多個節點(協調)

理想的情況下,如果你正在使用Cassandra的一個多節點設置:

閱讀:https://github.com/apache/cassandra/blob/trunk/conf/cassandra.yaml#L362

關於您的應用程序的性能更好。正因爲如此,最好不要堅持使用相同的連接,因爲你總是與同一位協調員交談。其次,如果你是多線程的,你希望確保你的連接在用於Cassandra的每個查詢期間使用同一個線程,否則,你最終會遇到競爭條件,其中一個線程正在更新已被使用的連接的資源(例如,試圖發送查詢數據包到服務器,以前它正在等待服務器的響應)。

我建議實現一個線程安全的連接池,並在應用程序啓動時打開多個連接,並隨機將它們用於每個請求,並在應用程序服務器停止時將其終止。如果您有硬件限制,請確保考慮更改Cassandra中的rpc_server_type。

0

DataStax C#驅動程序已經在內部提供連接池,因此建議使用該驅動程序的方法是使用每個C *羣集的Cluster實例和每個keyspace的Session。在應用程序啓動時基本初始化這些實例(nb您也可以準備PreparedStatements),在請求中重複使用這些語句,並在停止應用程序時關閉它們以進行清理(用於升級等)。我會強烈建議您快速閱讀C# driver docs。它不應該讓你漫長,你會更多地瞭解驅動程序中包含的內容。