永久连接到cassandra或连接每个请求?

时间:2014-01-15 22:01:22

标签: c# asp.net-web-api nosql cassandra

我现在正在为WebApi 2实现我自己的UserStore,所以它适用于cassandra。我的问题是,如果我应该在请求后关闭连接并重新连接到cassandra以获取下一个请求。

现在我正在启动应用程序时建立连接,并将cassandra Context传递给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
    }

2 个答案:

答案 0 :(得分:3)

当您决定是否应该连接池时,通常需要回答2个问题:

  1. 每次建立连接的成本是多少?
  2. 在某些网络(如EC2)上建立连接的成本更高,具体取决于网络类型和计算机以及您的体系结构设置。它可能需要几毫秒,如果您每次都建立连接,则会增加查询时间。如果您关心保存这些毫秒,那么汇集连接对您来说是更好的选择。

    1. 与数据库的连接是由您的操作系统管理的资源,您的应用服务器和数据库服务器在使用或休眠时都会保留这些资源。如果您的硬件资源很少,则应将连接视为文件。您打开它们,读取或写入它们,然后关闭它们。如果您没有硬件资源限制,那么不必担心资源池化。
    2. 在Cassandra方面,如果你将rpc_server_type设置为同步,那么每个连接都有自己的线程,最少需要180K,如果你有很多客户端,那么内存将是你的限制因素。如果你选择hsha作为rpc_server_type,那么这不会有问题。

      阅读本文:https://github.com/apache/cassandra/blob/trunk/conf/cassandra.yaml#L362

      关于您的应用程序性能:

      理想情况下,如果您使用带有多节点设置的Cassandra,您希望将请求分发到多个节点(协调器),以便更好地扩展。因此,最好不要坚持使用相同的连接,因为你总是与同一个协调员交谈。

      其次,如果你是多线程的,你想确保你的连接在用于Cassandra的每个查询的持续时间时都坚持使用相同的线程,否则,你可能会遇到竞争条件,其中一个线程是更新已经使用的连接的资源(例如,当它之前等待来自服务器的响应时,尝试向服务器发送查询数据包)。

      我建议实现一个线程安全的连接池,并在启动应用程序时打开几个连接,并为每个请求随机使用它们,并在应用程序服务器停止时终止它们。如果您有硬件限制,请务必考虑更改Cassandra中的rpc_server_type。

答案 1 :(得分:0)

DataStax C#驱动程序已在内部提供连接池,因此推荐的使用驱动程序的方法是使用每个C *集群的Cluster实例和每个键空间的Session。在应用程序启动时基本初始化这些( nb 你也可以准备PreparedStatements,在请求中重复使用这些,并在停止应用程序时关闭它们以进行清理(用于升级等)。

我强烈建议您快速阅读C# driver docs。它不应该花费你很长时间,你会更多地了解驱动程序中包含的内容。