首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Booksleeve是否过早关闭连接?

Booksleeve是否过早关闭连接?
EN

Stack Overflow用户
提问于 2013-03-28 22:16:36
回答 1查看 632关注 0票数 1

我在VS2010中使用1.1.0.5版本的Booksleeve时遇到了困难,因为我打算使用它。在执行并等待操作之后,Booksleeve有时会使连接处于关闭状态,因此下游操作会抛出异常。

我遇到的最简单的问题是:

代码语言:javascript
复制
static void Main(string[] args)
{
     Func<RedisConnection> getNewRedisConnection = () =>
        {
            RedisConnection conn = new RedisConnection("Belasco");
            conn.Error += (obj, eArgs) => { throw eArgs.Exception; };
            return conn;
        };

    RedisConnection redisConn = null;
    TaskScheduler.UnobservedTaskException += new EventHandler<UnobservedTaskExceptionEventArgs>(TaskScheduler_UnobservedTaskException);

    redisConn = getNewRedisConnection();
    redisConn.Open();

    var test1 = redisConn.Sets.GetAllString(0, "test1");
    var testValues1 = test1.Result;
    //var testValues1 = redisConn.Wait(test1);

    var test2 = redisConn.Sets.GetAllString(0, "test2");
    var testValues2 = test2.Result;
    //var testValues2 = redisConn.Wait(test2);

    redisConn.Close(false);

    Console.WriteLine("Done");
    Console.ReadKey();
}

static void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
    throw new NotImplementedException();
}

Line var test2 = redisConn.Sets.GetAllString(0, "test2");抛出'The queue is closed‘异常。

现在,如果我关闭并重新打开请求之间的连接,事情似乎可以正常工作。

代码语言:javascript
复制
    var test1 = redisConn.Sets.GetAllString(0, "test1");
    var testValues1 = test1.Result;
    //var testValues1 = redisConn.Wait(test1);

    redisConn.Close(false);
    redisConn = getNewRedisConnection();
    redisConn.Open();

    var test2 = redisConn.Sets.GetAllString(0, "test2");
    var testValues2 = test2.Result;
    //var testValues2 = redisConn.Wait(test2);

然而,如果我执行一个“设置”操作,所有的操作似乎又回到了中断状态。

代码语言:javascript
复制
    redisConn = getNewRedisConnection();
    redisConn.Open();

    var test0 = redisConn.Sets.Add(0, "test1", new string[] { "11", "22", "33", "44", "55" });
    redisConn.Wait(test0);

    redisConn.Close(false);
    redisConn = getNewRedisConnection();
    redisConn.Open();

    var test1 = redisConn.Sets.GetAllString(0, "test1");
    var testValues1 = test1.Result;
    //var testValues1 = redisConn.Wait(test1);

    redisConn.Close(false);
    redisConn = getNewRedisConnection();
    redisConn.Open();

    var test2 = redisConn.Sets.GetAllString(0, "test2");
    var testValues2 = test2.Result;
    //var testValues2 = redisConn.Wait(test2);

我在事务方面也有同样的问题,但我觉得这是源于相同的问题。我需要检索值,然后将另一个命令排入队列的原因是因为我随后使用Redis的操作是基于我得到的值来确定的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-30 00:21:01

首先,不要急于在这里关闭连接离子。BookSleeve被设计为用作线程安全的多路复用器,同时从任意随机数量的调用者那里获取负载。打开一个连接是有开销的。现在,有几种方法可以关闭红色is连接:

  • 您有选择地将其关闭
  • 服务器将其关闭(连接超时,客户端无法处理积压)
  • 客户端在入站流中检测到它不期望的内容

我的猜测是服务器配置了连接超时。我不知道1.1.*,但在某个时候添加了自动超时配置检测和保持活动的"ping“消息,这很有帮助。您可以通过redis-cli中的"config get timeout“查看超时。如果这就是问题所在,您可能会发现升级客户端版本很有帮助。在某些构建中,您还可以手动指定超时配置(如果您希望否决服务器)。

对于意想不到的数据-这是不太可能的,但有几个事件,你可以检测,记录和反应。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15684187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档