我正在使用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被关闭,从而允许将相应的会话返回到会话池。

关于java - RESOURCE_EXHAUSTED池中没有可用的 session ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52695111/

10-11 10:55