繁体   English   中英

RESOURCE_EXHAUSTED池中没有可用的会话

[英]RESOURCE_EXHAUSTED No session available in the pool

我正在使用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);
    }
}

听起来您有会话泄漏。 确保在所有DatabaseClient.singleUse *或DatabaseClient.ReadOnlyTransaction调用周围使用try-with-resources表达式,以确保Transaction或ResultSet被关闭,从而允许将相应的会话返回到会话池。

您正在设置.setMaxSessions(100) ,它显然超出了预定义的限制。

原则上,当一个客户端已经分配了100 ,下一个客户端只能分配0

会议文档如下:

注意 :Cloud Spanner客户端库将自动管理会话。

...阅读源代码后,我确定仅在使用.setFailIfPoolExhausted()时才会引发错误消息。 如果StackDriver监控显示相反的情况,它报告报告池已耗尽,这可能是一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM