我创建一个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客户端文件,如果你正确设置MaxSessions
- 客户端将维护这些多届的照顾。
在高层次上,流动将是这样的:
If currentSessions < MaxSessions {
if !idleSessions.empty()
use an idle session.
else
CreateNewSession.
} else {
Block/Fail based on action chosen in : ActionOnExhaustion.
}
如果你想避免了createSession小的开销,因为请求处理的一部分,一个值得推荐的是保持minSessions
和maxSessions
与您的并发TPS的要求,以便在一开始我们有一颗颗会议准备就绪。
对于像会话监控额外的细节,保持空闲会话活着:请参阅文档:https://cloud.google.com/spanner/docs/sessions