我正在使用Java的Spanner客户端库,并使用Spring来配置客户端。
过一会儿,应用程序开始记录以下消息,但我不明白为什么。应用程序并发性很小。会话似乎没有被重用。有什么建议吗?
RESOURCE_EXHAUSTED:池中没有可用的会话。最大人数 池中的会话数可以通过调用来覆盖 SessionPoolOptions#Builder#setMaxSessions。可以阻止客户 而不是因设置而失败 SessionPoolOptions#Builder#setBlockIfPoolExhausted。
@Configuration
public class SpannerConfig {
@Value("${datasource.instanceId}")
private String instance;
@Value("${datasource.databaseId}")
private String database;
@Bean
public Spanner spannerService() throws IOException {
SessionPoolOptions sessionPoolOptions = SessionPoolOptions.newBuilder()
.setFailIfPoolExhausted()
.setMinSessions(5)
.setMaxSessions(100)
.build();
SpannerOptions options = SpannerOptions.newBuilder()
.setSessionPoolOption(sessionPoolOptions)
.build();
return options.getService();
}
@Bean
public DatabaseClient spannerClient(Spanner spannerService) {
DatabaseId databaseId = DatabaseId.of(spannerService.getOptions().getProjectId(), instance, database);
return spannerService.getDatabaseClient(databaseId);
}
}
答案 0 :(得分:2)
听起来您有会话泄漏。确保您在任何DatabaseClient.singleUse *或DatabaseClient.ReadOnlyTransaction调用周围使用try-with-resources表达式,以确保关闭Transaction或ResultSet,从而允许将相应的会话返回到会话池。
答案 1 :(得分:0)
您设置的.setMaxSessions(100)
显然超出了预定义的限制。
原则上,当一个客户端已经分配了100
时,下一个客户端只能分配0
。
会话的documentation如下:
注意:Cloud Spanner客户端库自动管理会话。
...阅读源代码后,我确定仅在使用.setFailIfPoolExhausted()
时才引发错误消息。如果StackDriver监控显示相反的情况,它会报告池已耗尽,这可能是一个错误。