Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 资源池中没有可用的会话_Java_Google Cloud Platform_Google Cloud Spanner - Fatal编程技术网

Java 资源池中没有可用的会话

Java 资源池中没有可用的会话,java,google-cloud-platform,google-cloud-spanner,Java,Google Cloud Platform,Google Cloud Spanner,我正在使用用于Java的扳手客户端库,并使用Spring配置客户端 过了一会儿,应用程序开始记录下面的消息,但我不明白为什么。应用程序并发性最小。看起来这些会话没有被重用。有什么建议吗 资源耗尽:池中没有可用的会话。最大数量 可以通过调用 SessionPoolOptions#Builder#setMaxSessions。客户端可以被设置为阻止 而不是通过设置失败 SessionPoolOptions#Builder#setblockifpools已耗尽 您正在设置.setMaxSessions

我正在使用用于Java的扳手客户端库,并使用Spring配置客户端

过了一会儿,应用程序开始记录下面的消息,但我不明白为什么。应用程序并发性最小。看起来这些会话没有被重用。有什么建议吗

资源耗尽:池中没有可用的会话。最大数量 可以通过调用 SessionPoolOptions#Builder#setMaxSessions。客户端可以被设置为阻止 而不是通过设置失败 SessionPoolOptions#Builder#setblockifpools已耗尽


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

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

会议的议程如下:

注意:云扳手客户端库自动管理会话


。。。在阅读了源代码之后,我确信只有在使用
.setfailifpoolexpeated()
时才会抛出错误消息。如果StackDriver监控告诉您相反的情况,它报告耗尽的池可能是一个错误。

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

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

会议的议程如下:

注意:云扳手客户端库自动管理会话



。。。在阅读了源代码之后,我确信只有在使用
.setfailifpoolexpeated()
时才会抛出错误消息。它报告一个耗尽的池,这可能是一个错误,以防StackDriver监视告诉相反的情况。

听起来像是会话泄漏。确保在任何DatabaseClient.singleUse*或DatabaseClient.ReadOnlyTransaction调用中使用了try with resources表达式,以确保事务或结果集关闭,从而允许将相应的会话返回到会话池。

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

如果我删除会话会话池选项,结果相同,但不是客户端挂起。我将澄清DatabaseClient是一个我重用的单例bean(只创建了一个客户端)@lascarayf即使它是单例,也可能需要一段时间才能再次释放以前分配的会话。指令只是设置了限制,而客户端可能会打开太多的新会话,而不会关闭以前的会话。看看有没有一个想法,幕后到底发生了什么。谢谢马丁,我将处理消除最大限制的问题。我一会儿告诉你发生了什么事。我正在使用stackdriver监视会话,但我只有不到20个会话。@lascarayf错误消息可能是误报,或者可能来自其他设置,而不是它所建议的。客户端代码在此处可用:在调试后在此处打开问题可能是一个选项。是的,Martin,错误资源_耗尽是因为options.isfailifpooldefined()。如果我删除该行,应用程序将一直挂起,直到释放会话(在我的情况下永远不会)如果我删除会话SessionPoolOptions,结果是相同的,但不是客户端挂起。我将澄清DatabaseClient是一个我重用的单例bean(只创建了一个客户端)@lascarayf即使它是单例,也可能需要一段时间才能再次释放以前分配的会话。指令只是设置了限制,而客户端可能会打开太多的新会话,而不会关闭以前的会话。看看有没有一个想法,幕后到底发生了什么。谢谢马丁,我将处理消除最大限制的问题。我一会儿告诉你发生了什么事。我正在使用stackdriver监视会话,但我只有不到20个会话。@lascarayf错误消息可能是误报,或者可能来自其他设置,而不是它所建议的。客户端代码在此处可用:在调试后在此处打开问题可能是一个选项。是的,Martin,错误资源_耗尽是因为options.isfailifpooldefined()。如果我删除该行,应用程序将一直挂起,直到会话被释放(在我的情况下永远不会),而StackDriver会告诉我其他情况…限制可能不会超过-或者没有设置。
ResultSet rs=span crlient.singleUse().executeQuery(语句)是我唯一尝试将其放入资源块中的东西:try(ResultSet rs=cranerclient.singleUse().executeQuery(statement)){…},而StackDriver告诉我不是这样的…限制可能没有超过-或者没有设置。
ResultSet rs=cranerclient.singleUse().executeQuery(statement)是我在try with resources块中唯一做的事情:try(ResultSet rs=span.singleUse().executeQuery(statement)){…}
@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);
    }
}