谷歌扳手单重新连接故障

问题描述 投票:1回答:1

我创建一个SpannerSingleton来保持连接的应用程序的生命时间。我感兴趣的是连接持久......如果有一个会话/连接问题,我怎样才能重新建立会话?

一个想法是生成一个新的连接,如果池的90%以上被耗尽增加setMaxSessions到一个更高的数字。像指数退避相反?但是,在/我该怎么办呢?我找不到客户端库,将让我监视池的状态或客户端计数任何东西。

bill-pugh-singleton去cuz它似乎是一个不错的选择...

以下是我有:

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

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);

    }
}

我想补充的东西,会检查连接池,看看如何接近饿死我们,然后重新创建自己......我可能会思前想它,但如果连接中断可能会发生什么?

java google-cloud-platform google-cloud-spanner
1个回答
2
投票

客户端库应该注意保持健康的会话池,用户不应该有明确担心会话/连接。

作为Java客户端文件,如果你正确设置MaxSessions - 客户端将维护这些多届的照顾。

在高层次上,流动将是这样的:

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

© www.soinside.com 2019 - 2024. All rights reserved.