首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >谷歌扳手单例故障重新连接

谷歌扳手单例故障重新连接
EN

Stack Overflow用户
提问于 2019-02-08 16:38:57
回答 1查看 166关注 0票数 1

我正在创建一个SpannerSingleton,以便在应用程序生命周期内保持连接。我对连接耐久性感兴趣..。如果存在会话/连接问题,如何重新创建会话?

一个想法是,如果超过90%的池耗尽,则生成一个新的连接,将setMaxSessions增加到更高的数量。就像指数退避的反面?但我在哪里/怎么能做到呢?我无法在客户端库中找到任何允许我监视池状态或客户机计数的内容。

我和比尔-普格-单身人士一起去的,因为这似乎是个不错的选择.

以下是我所拥有的:

代码语言:javascript
运行
AI代码解释
复制
public class SpannerSingleton {

    private static Spanner spanner;
    private static SpannerOptions options;

    private static SessionPoolOptions sessionPoolOps = SessionPoolOptions
            .newBuilder()
            .setMaxSessions(1000)  // 1000 concurrent queries
            .setMinSessions(100)  // keep 100 alive
            .setMaxIdleSessions(100)  // how many to keep from being idle and closed
            .build(); 

    private SpannerSingleton() {
        try {
            options = SpannerOptions
                    .newBuilder()
                    .setSessionPoolOption(sessionPoolOps)
                    .build();

            spanner = options.getService();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static class SingletonHelper{
        private static final Spanner CONNECTION = new SpannerSingleton().spanner;
    } 

    public static synchronized Spanner getSpanner() {
        return SingletonHelper.CONNECTION;
    }

}

我使用工厂模式来创建dbClient

代码语言:javascript
运行
AI代码解释
复制
public SpannerFactory {

    private static Spanner spanner = SpannerSingleton.getSpanner();
    private static DatabaseId dbId;

    public static DatabaseClient getConnection(String instance) {
        if (Util.isEmpty(instance)) return null;

        if ("mickey".equalsIgnoreCase(instance)) {
            dbId = DatabaseId.of(spanner.getOptions().getProjectId(), "instance1", "mickey");
        }

        if ("mouse".equalsIgnoreCase(instance)) {
            dbId = DatabaseId.of(spanner.getOptions().getProjectId(), "instance1", "mouse");
        }

        return spanner.getDatabaseClient(dbId);

    }
}

我想补充的是一些东西,可以检查连接池,看看我们离饥饿有多近,然后重新创建自己.我可能想太多了,但是如果连接中断会发生什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-11 10:44:11

客户端库应该负责维护健康的会话池,用户不应该显式地担心sessions/connections

正如java客户机中所记录的那样,如果您正确地设置了MaxSessions -客户机将负责维护这些会话。

在较高的水平上,流动就像:

代码语言:javascript
运行
AI代码解释
复制
If currentSessions < MaxSessions {
   if !idleSessions.empty()
        use an idle session.
   else
        CreateNewSession.
} else {
   Block/Fail based on action chosen in : ActionOnExhaustion.
}

如果您希望避免CreateSession中的小开销作为请求处理的一部分,建议的一个选项是将minSessionsmaxSessions与并发的TPS需求保持一致,以便在开始时可以使用这些多个会话。

有关会话监视、保持空闲会话处于活动状态的其他详细信息,请参阅以下文档:https://cloud.google.com/spanner/docs/sessions

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

https://stackoverflow.com/questions/54602065

复制
相关文章

相似问题

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