RESOURCE_EXHAUSTED 池中没有可用的会话

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

    }

}


慕姐8265434
浏览 306回答 2
2回答

浮云间

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

长风秋雁

您正在设置的设置.setMaxSessions(100)显然超出了预定义的限制。原则上,当一个客户端已经分配了100,下一个客户端只能分配0。该文件为会议内容如下:注意:Cloud Spanner 客户端库自动管理会话。...阅读源代码后,我确定错误消息仅在使用.setFailIfPoolExhausted(). 它报告一个耗尽的池,可能是一个错误,以防 StackDriver 监控告诉相反的情况。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java