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